gpt4 book ai didi

android - 如何在 Jetpack Compose 导航期间保存 LazyColumn 的分页状态

转载 作者:行者123 更新时间:2023-12-04 23:53:27 24 4
gpt4 key购买 nike

我正在使用 androidx.paging:paging-compose (v1.0.0-alpha-14),连同 Jetpack Compose (v1.0.3),我有一个自定义 PagingSource它负责从后端拉取项目。
我还使用撰写导航组件。
问题是我不知道如何在通过 NavHostController 导航到不同屏幕和返回(滚动状态和缓存项目)之间保存 Pager 流的状态。
我试图通过 rememberSaveable 保存状态但它不能完成,因为它不是可以放入 Bundle 的东西。
是否有一个快速/简单的步骤来做到这一点?
我的示例代码:

@Composable
fun SampleScreen(
composeNavController: NavHostController? = null,
myPagingSource: PagingSource<Int, MyItem>,
) {
val pager = remember { // rememberSaveable doesn't seems to work here
Pager(
config = PagingConfig(
pageSize = 25,
),
initialKey = 0,
pagingSourceFactory = myPagingSource
)
}
val lazyPagingItems = pager.flow.collectAsLazyPagingItems()

LazyColumn() {
itemsIndexed(items = lazyPagingItems) { index, item ->
MyRowItem(item) {
composeNavController?.navigate(...)
}
}
}
}

最佳答案

我找到了解决办法!

@Composable
fun Sample(data: Flow<PagingData<Something>>):
val listState: LazyListState = rememberLazyListState()
val items: LazyPagingItems<Something> = data.collectAsLazyPagingItems()

when {
items.itemCount == 0 -> LoadingScreen()
else -> {
LazyColumn(state = listState, ...) {
...
}
}
}
...

我刚刚发现使用 Paging 时的问题是什么. Paging 不记住列表滚动位置的原因当导航归结为引擎盖下发生的事情时。
它看起来像这样:
  • 可与 LazyColumn 组合使用被 build 。
  • 我们异步 从寻呼机请求我们的列表数据。当前寻呼机列表项计数 = 0。
  • UI 绘制了一个包含 0 个项目的lazyColumn。
  • 寻呼机响应数据,例如10 个项目,并且 UI 被重新组合以显示它们。
  • 用户滚动例如一直向下并单击底部项目,将它们导航到其他地方。
  • 用户使用例如导航返回后退按钮。
  • 哦哦。由于导航,我们的可组合 LazyColumn被重组。我们从 重新开始异步 请求寻呼机数据。注意:寻呼机项目计数再次 = 0!
  • rememberLazyListState被评估,它告诉 UI 用户一直向下滚动,所以它现在应该回到相同的偏移量,例如到第五项。

  • 这是 UI 在困惑中尖叫的地方,因为 pager 有 0 个项目,所以lazyColumn 有 0 个项目。
    UI 无法处理到第五个项目的滚动偏移量。滚动位置设置为仅从项目 0 开始显示,因为只有 0 个项目。
    接下来发生什么:
  • 寻呼机回应说有例如再次10个项目,导致另一个重组。
  • 重组后,我们再次看到我们的列表,滚动位置从项目 0 开始。

  • 要确认您的代码是否属于这种情况,请在 LazyColumn 上方添加一个简单的日志语句。称呼:
    Log.w("TEST", "List state recompose. " +
    "first_visible=${listState.firstVisibleItemIndex}, " +
    "offset=${listState.firstVisibleItemScrollOffset}, " +
    "amount items=${items.itemCount}")
    在导航返回时,您应该会看到一条日志行,说明完全相同的 first_visibleoffset , 但使用 amount items=0 .
    紧随其后的行将显示 first_visibleoffset被重置为 0 .
    我的解决方案有效,因为它跳过了使用 listState直到寻呼机加载数据。
    加载后,正确的值仍然存在于 listState 中。 ,并且滚动位置正确恢复。
    来源: https://issuetracker.google.com/issues/177245496

    关于android - 如何在 Jetpack Compose 导航期间保存 LazyColumn 的分页状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69739108/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com