Jetpack Compose中AnimatedNavHost内超28个composable元素应用崩溃如何解决
问题根因
这个异常是旧版本Jetpack Navigation组件的已知内部缺陷,当单张导航图下的目的地节点数量超过28个时,内部存储节点的SparseArrayCompat扩容逻辑异常,触发数组越界。你当前的根导航图下已经有2个显式声明的页面+26个其他页面,合计28个,新增第29个就触发了这个问题。
解决思路
- 方案1:升级依赖版本
将Jetpack Navigation核心依赖升级到2.5.3及以上稳定版,同时将Accompanist动画导航依赖升级到与Navigation版本匹配的对应版本即可修复该内部缺陷。 - 方案2:修正重复的route值
排查所有composable声明中用到的route常量,如果存在重复的route值,修改为全局唯一即可。重复的route会导致节点索引计数异常,也会触发该越界问题。 - 方案3:拆分嵌套导航图
如果暂时不方便升级依赖,可以将业务关联性强的页面拆分为多个嵌套导航图,单张导航图内的节点数量控制在28个以内,即可规避该问题。嵌套导航图示例写法如下:AnimatedNavHost( navController = navController, startDestination = Constants.SPLASH, enterTransition = { initial, _ -> slideInHorizontally(initialOffsetX = { 1000 }) }, exitTransition = { _, target -> slideOutHorizontally(targetOffsetX = { -1000 }) }, popEnterTransition = { initial, _ -> slideInHorizontally(initialOffsetX = { -1000 }) }, popExitTransition = { _, target -> slideOutHorizontally(targetOffsetX = { 1000 }) } ) { // 根导航图下只保留基础入口页面 composable(Constants.SPLASH) { Splash(navController = navController) } composable(Constants.HIW) { LogoPage( false, true, navController = navController ) { HowItWorks(navController = navController, false) } } // 嵌套主业务导航图 navigation( startDestination = Constants.MAIN_HOME, route = Constants.MAIN_GRAPH ) { // 原有的其他业务页面迁移到该子图内,单图节点数不超过28 composable(Constants.MAIN_HOME) { HomePage(navController) } composable(Constants.MINE) { MinePage(navController) } // 其他业务页面 } // 可按需新增其他嵌套子导航图 }
内容的提问来源于stack exchange,提问作者Sparsh Dutta
相关产品推荐
相关产品推荐

