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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:39:00