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

Android Compose Pager组件索引越界崩溃问题求助

分析Compose Pager触发的IndexOutOfBoundsException(索引-1,大小4)

崩溃核心原因

java.lang.IndexOutOfBoundsException: Index -1, size 4 说明Compose Pager尝试访问索引为-1的页面,但当前Pager的页面总数是4。索引-1属于非法值,通常是Pager的当前页面状态或页面计数逻辑出现异常导致的。

可能的触发场景及排查方向

  • 当前页面状态被错误设置为-1
    控制Pager页面切换的PagerState(或自定义状态变量)可能被意外赋值为-1:

    • 初始化PagerState时错误设置currentPage = -1(正确初始值应为0,当存在页面时)
    • 页面切换逻辑中,对当前索引的增减操作未做边界校验(比如在第一页时执行索引递减操作)
    • 异步数据加载完成后,状态更新逻辑出错,导致当前页面索引变为-1
  • 页面计数与数据源同步异常
    Pager的pageCount参数设置为4,但某些场景下实际提供页面内容的数据源状态未同步:

    • 数据源加载完成前,pageCount被提前设置为4,但此时PagerState的currentPage可能处于未初始化的非法值
    • 数据源发生变化时,pageCount更新不及时,导致当前页面索引与实际页面总数不匹配
  • 状态更新的竞态条件
    Compose重组过程中,页面计数和当前页面状态的更新不同步:

    • 例如在LaunchedEffect中异步更新数据源后,仅修改了pageCount但未同步修正currentPage
    • 快速滑动或页面切换动画过程中,状态变量的更新逻辑未处理边界情况
  • Pager组件版本bug
    旧版本的androidx.compose.foundation:foundation-pager可能存在边界处理缺陷,比如快速滑动时索引计算错误。建议升级到最新稳定版,验证问题是否消失。

排查建议

  • 检查PagerState的初始化代码,确保currentPage的初始值在合法范围内(0到pageCount-1)
  • 添加状态监听:用LaunchedEffect(pagerState.currentPage)监听当前页面索引变化,当索引为-1时记录详细日志(如用户操作路径、数据源状态),定位触发场景
  • 确保pageCount始终与数据源长度保持一致,避免出现页面计数与实际内容不匹配的情况
  • 在测试环境中模拟极端操作(快速滑动、屏幕旋转、后台恢复),尝试复现崩溃,便于定位问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:14:50