Jetpack Compose点击LazyColumn项跳转详情页触发索引越界崩溃
Jetpack Compose 列表跳转详情页索引越界崩溃修复
崩溃原因
日志明确抛出java.lang.IndexOutOfBoundsException: Index: 0, Size: 0,核心问题是直接访问过滤后列表的0号下标时,列表本身是空的:
- 本地数据源是同步加载的,进入详情页时数据已经完全就绪,filter操作可以立刻匹配到对应articleId的条目,不会出现空列表
- 改成Firebase异步加载+MVVM实现后,Compose首次触发重组进入
Success分支时,存在瞬时状态:要么列表数据刚完成赋值还没匹配到目标id,要么传入的articleId为空/和列表内id不匹配,此时filter返回空列表,直接访问newArticle[0]必然触发越界
修复方案(保留过滤全量列表的实现逻辑,无需新增单条文章查询接口)
- 前置校验传入的
articleId合法性,id为空时直接展示错误提示 - 用
firstOrNull()替代filter后取0号下标的写法,空安全获取匹配的文章对象 - 对匹配结果做判空,未拿到目标文章时展示加载态/错误提示,不要强行渲染详情组件
- 修正原有代码里
ArticleContent错误传入title的笔误
修复后代码
@Composable fun DetailsUI(navController: NavController, articleId: String?,viewModel: ArticleViewModel = hiltViewModel()) { val expanded = remember { mutableStateOf(false) } val articleResponse = viewModel.articleState.value Scaffold { when (articleResponse) { is Loading -> ProgressBar() is Success -> Column { // 前置校验articleId if (articleId == null) { Utils.printError("文章参数异常,无法加载详情") return@Column } // 空安全获取匹配的目标文章 val targetArticle = articleResponse.data.firstOrNull { article -> article.id == articleId } // 匹配到文章再渲染详情UI if (targetArticle != null) { ArticleHeader(image = targetArticle.image) ArticleTitle(title = targetArticle.title, author = targetArticle.author) // 修正原代码笔误:内容区传content而非title ArticleContent(content = targetArticle.content) } else { // 未匹配到时展示加载态,避免白屏 ProgressBar() } } is Error -> Utils.printError(articleResponse.message) } } }
补充说明:如果页面长时间停留在加载态,说明导航时传入的articleId和Firebase返回的文章id字段类型/值不匹配,检查列表项点击时的参数传值逻辑即可。
内容的提问来源于stack exchange,提问作者MayWheather
相关产品推荐
相关产品推荐

