Jetpack Compose LazyList新增item自动滚动到底部异常问题排查
问题修复方案
问题根源
当前实现存在两个核心错误导致异常:
- 滚动逻辑触发时机错误:将滚动逻辑放在了每个列表项的重组作用域内,只要有任意列表项进入可视区(包括手动滑动时滑出的新项),都会触发滚到底部的逻辑,导致手动滑动后自动回弹
- 重复触发+索引错误:每个列表项重组都会启动一个滚动协程,多个动画任务冲突导致卡顿;同时滚动目标索引写为
results.size,列表索引从0开始,该值本身超出了合法索引范围
修复后代码
@Composable fun ResultsList(results: List<Pair<Square, Boolean>>) { val listState = rememberLazyListState() // 仅当列表长度变化时触发滚动逻辑 LaunchedEffect(results.size) { // 可选优化:用户手动滑动过程中不强制回滚,不需要可删除该判断 if (!listState.isScrollInProgress) { // 修正最后一项的索引为总长度减1 listState.animateScrollToItem(results.size - 1) } } LazyRow(state = listState) { items(results) { result -> ResultsItem(result.first, result.second) } } }
改动说明
- 移除了列表项内部的滚动逻辑和多余的
rememberCoroutineScope声明:LaunchedEffect自带协程执行上下文,不需要额外创建作用域 - 用
LaunchedEffect绑定results.size作为唯一触发键:只有列表新增条目导致长度变化时才会执行滚动,手动滑动不会触发该逻辑 - 修正滚动目标索引为合法的最后一项索引,避免非法索引导致的异常
- 新增可选的滑动状态判断:用户手动滑动过程中如果有新条目入库,不会打断用户当前操作强制回到底部,更符合常规交互习惯
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

