Android 组合:LazyColumn 和 Room with suspend DAO
Android compose: LazyColumn and Room with suspend DAO
我想在 Android Compose 中做一件看似简单的事情,显示从 Room 数据库动态加载的大列表:
LazyColumn(count) { index ->
val myItemModel = db.itemDAO().getAt(index)
MyItemView(myItemModel)
}
应该暂停 DAO 方法以更好地发挥作用。但是挂起函数显然不能从@Composable 函数中调用。我不想做 runBlocking。我可以将 myItemModel 转换为代理并在 LaunchedEffect 中将其膨胀,但随后 LazyColumn 的滚动被破坏,因为它无法预测视口偏移位置,因为项目具有不同的内容和高度。
在 LazyColumn 中显示大型列表的规范方式是什么?
首先,从数据库中一个一个地加载项目不是一个好主意。加载一些更大的数据块,可能一次加载 100 个项目。
从数据库加载数据并在 LazyColumn
中显示它们的规范方法是使用 ViewModel
。您可以在 ViewModel
中的后台线程上进行加载,将其发布为 StateFlow<List<MyItem>>
,将其收集到可组合项中并在 LazyColumn
中显示。
对于加载,您还可以使用 paging library. It is nicely integrated with Compose - there is a collectAsLazyPagingItems() function for collecting the items and items() 函数,这会将它们直接送入您的 LazyColumn
。
我想在 Android Compose 中做一件看似简单的事情,显示从 Room 数据库动态加载的大列表:
LazyColumn(count) { index ->
val myItemModel = db.itemDAO().getAt(index)
MyItemView(myItemModel)
}
应该暂停 DAO 方法以更好地发挥作用。但是挂起函数显然不能从@Composable 函数中调用。我不想做 runBlocking。我可以将 myItemModel 转换为代理并在 LaunchedEffect 中将其膨胀,但随后 LazyColumn 的滚动被破坏,因为它无法预测视口偏移位置,因为项目具有不同的内容和高度。
在 LazyColumn 中显示大型列表的规范方式是什么?
首先,从数据库中一个一个地加载项目不是一个好主意。加载一些更大的数据块,可能一次加载 100 个项目。
从数据库加载数据并在 LazyColumn
中显示它们的规范方法是使用 ViewModel
。您可以在 ViewModel
中的后台线程上进行加载,将其发布为 StateFlow<List<MyItem>>
,将其收集到可组合项中并在 LazyColumn
中显示。
对于加载,您还可以使用 paging library. It is nicely integrated with Compose - there is a collectAsLazyPagingItems() function for collecting the items and items() 函数,这会将它们直接送入您的 LazyColumn
。