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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:24:08