Android 撰写:带有挂起 DAO 的 LazyColumn 和 Room
我想在 Android Compose 中做一件看似简单的事情,显示从 Room 数据库动态加载的大列表:
LazyColumn(count) { index ->
val myItemModel = db.itemDAO().getAt(index)
MyItemView(myItemModel)
}
DAO 方法应该暂停才能发挥作用。但是挂起函数显然不能从 @Composable 函数调用。我不想执行 runBlocking。我可以将 myItemModel 转换为代理并在 LaunchedEffect 中将其膨胀,但随后 LazyColumn 的滚动被破坏,因为它无法预测视口偏移位置,因为项目具有不同的内容和高度。
在 LazyColumn 中显示大型列表的规范方法是什么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
首先,从数据库中一项一项地加载项目并不是一个好主意。加载一些较大的数据块,例如一次加载 100 个项目。
从数据库加载数据并在
LazyColumn
中显示数据的规范方法是使用ViewModel
。您将在ViewModel
中的后台线程上进行加载,将其发布为StateFlow
,在可组合项中收集它的流并将其显示在>
LazyColumn
。对于加载,您还可以使用分页库。它与 Compose 很好地集成 - 有一个 collectAsLazyPagingItems() 函数用于收集项目和 items() 函数,它将直接将它们输入到您的
LazyColumn
。Firstly, it's not a good idea to load your items from database one by one. Load some larger chunks of your data, something like 100 items at a time maybe.
The canonical way of loading data from db and displaying them in
LazyColumn
would be using aViewModel
. You would do the loading on the background thread in yourViewModel
, publish it as aStateFlow<List<MyItem>>
, collect it flow in your composable and display it inLazyColumn
.For the loading, you can also use the paging library. It is nicely integrated with Compose - there is a collectAsLazyPagingItems() function for collecting the items and items() function, which will feed them directly into your
LazyColumn
.