使用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
相关产品推荐
相关产品推荐

