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