Jetpack Compose NavHost中composable超13个触发数组越界如何解决?
问题触发原因
- 核心原因是
androidx.navigation:navigation-compose依赖库的历史bug:2.4.0-alpha01之前的版本,内部存储路由节点的SparseArrayCompat扩容逻辑存在问题,当单个NavHost下直接定义的composable路由项数量超过13个时,就会触发数组越界异常,和你提供的崩溃日志堆栈完全匹配。 - 你提供的代码片段存在笔误:最后一个路由定义行多了一个多余的右括号
composable(Routes.ProDetailPage + "{data}")) {,如果实际运行代码也存在该问题,会先触发编译错误,排除该笔误后,崩溃的根因就是上述的库版本bug。
可行解决方案
- 升级依赖版本(推荐):直接将navigation-compose依赖升级到2.4.0-alpha01及以上的稳定版即可,官方已经在该版本修复了这个路由数量限制的问题,例如可以在模块级build.gradle中修改依赖版本为:
可以根据自己的项目适配情况选择对应版本即可。implementation "androidx.navigation:navigation-compose:2.7.5" - 拆分嵌套导航图:如果暂时无法升级依赖,可以将业务关联的路由拆分到不同的嵌套导航图中,避免单个NavHost下直接定义的路由数量超过13个,示例修改如下:
@Composable fun Greeting(navController: NavHostController) { val actions = Actions(navController) NavHost(navController, startDestination = Routes.SplashPage) { // 启动相关路由 composable(Routes.SplashPage) { SplashPage(actions) } // 主业务嵌套导航图 navigation(startDestination = Routes.MainPage, route = "main_group") { composable(Routes.MainPage) { MainPage(actions) } composable(Routes.SearchPage) { SearchPage(actions) } composable(Routes.ProListPage) { ProListPage(actions) } composable(Routes.ProDetailPage + "{data}") { ProDetailPage(actions) } } // 个人中心嵌套导航图 navigation(startDestination = Routes.UserPage, route = "user_group") { composable(Routes.UserPage) { UserPage(actions) } composable(Routes.SetPage) { SetPage(actions) } composable(Routes.AboutPage) { AboutPage(actions) } composable(Routes.FeedBackPage) { FeedBackPage(actions) } } // 工具类路由 composable(Routes.WebViewPage + "{url}") { WebViewPage(actions, url = "") } composable(Routes.EditPage + "/{title}/{content}") { EditPage(actions) } composable(Routes.PwdSetPage + "{type}") { PwdSetPage(actions) } composable(Routes.QrCodePage) { QrCodePage(actions) } } } - 合并路由(不推荐):临时应急可以将逻辑相似的页面合并为同一个路由,通过传入不同的参数来区分渲染不同的页面内容,减少路由总数,但是该方案对业务代码侵入性较高,后续维护成本大,仅作为临时应急使用。
内容的提问来源于stack exchange,提问作者Gang2Android
相关产品推荐
相关产品推荐

