Android 撰写:带有挂起 DAO 的 LazyColumn 和 Room

发布于 2025-01-12 14:36:10 字数 402 浏览 0 评论 0 原文

我想在 Android Compose 中做一件看似简单的事情,显示从 Room 数据库动态加载的大列表:

LazyColumn(count) { index ->
    val myItemModel = db.itemDAO().getAt(index)
    MyItemView(myItemModel)
}

DAO 方法应该暂停才能发挥作用。但是挂起函数显然不能从 @Composable 函数调用。我不想执行 runBlocking。我可以将 myItemModel 转换为代理并在 LaunchedEffect 中将其膨胀,但随后 LazyColumn 的滚动被破坏,因为它无法预测视口偏移位置,因为项目具有不同的内容和高度。

在 LazyColumn 中显示大型列表的规范方法是什么?

I want to do a seemingly simple thing in Android Compose, display a large list dynamically loaded from a Room database:

LazyColumn(count) { index ->
    val myItemModel = db.itemDAO().getAt(index)
    MyItemView(myItemModel)
}

DAO methods should be suspend to play nice. But suspend functions obviously cannot be called from @Composable functions. I do not want to do runBlocking. I can turn myItemModel into proxy and inflate it in LaunchedEffect but then LazyColumn's scrolling is broken as it cannot predict the viewport offset position, because the items have different content and height.

What is the canonical way to display large list in LazyColumn?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

徒留西风 2025-01-19 14:36:10

首先,从数据库中一项一项地加载项目并不是一个好主意。加载一些较大的数据块,例如一次加载 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 a ViewModel. You would do the loading on the background thread in your ViewModel, publish it as a StateFlow<List<MyItem>>, collect it flow in your composable and display it in LazyColumn.

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文