You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用collectAsLazyPagingItems构建的LazyColumn导航后滚动位置丢失

解决LazyColumn导航返回后滚动位置丢失的问题

问题核心在于滚动状态未持久化以及Pager的状态未被正确保留,以下是具体修复方案:

1. 用rememberSaveable持久化滚动状态

直接调用rememberLazyListState()时,页面因导航销毁重建会重新创建状态实例,导致滚动位置重置。改用rememberSaveable结合LazyListState.Saver,可将状态序列化后存入SavedStateHandle,确保导航返回时能恢复:

val listState = rememberSaveable(stateSaver = LazyListState.Saver) {
    LazyListState()
}

2. 确保Pager所属ViewModel不被销毁

myPager作为PagingDataFlow,必须在ViewModel中创建,且ViewModel需通过viewModel()(常规Compose)或hiltViewModel()(Hilt)获取,保证导航过程中ViewModel不被销毁,Pager的加载状态得以保留:

// 在Composable中获取ViewModel实例
val myViewModel: MyViewModel = viewModel()
val pageItems = myViewModel.myPager.collectAsLazyPagingItems()

修复后的完整代码

val myViewModel: MyViewModel = viewModel()
val pageItems = myViewModel.myPager.collectAsLazyPagingItems()

// 持久化滚动状态
val listState = rememberSaveable(stateSaver = LazyListState.Saver) {
    LazyListState()
}

LazyColumn(
    state = listState,
    modifier = Modifier.padding(bottom = paddingValues.calculateBottomPadding())
) {
    itemsIndexed(pageItems) { index, pageItem ->
        pageItem?.let {
            Text("abc")
        }
    }
}

额外注意点

  • 跳转页面时避免使用popUpTo清除当前页面的栈,否则页面会被完全销毁,状态无法恢复。
  • 检查PagingSource实现,确保返回数据的一致性,避免因数据突变导致LazyColumn重新计算滚动位置。

内容的提问来源于stack exchange,提问作者Nikhil Dupally

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 19:22:15