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

如何在Jetpack Compose中添加404/全局捕获导航路由避免崩溃

实现Jetpack Compose Navigation的404兜底路由

步骤1:完善路由常量定义

先在你的NavRoutes中给404路由设置通配符*,让它能匹配所有未被显式定义的路由:

object NavRoutes {
    // 其他已定义路由...
    object Errors {
        const val NOT_FOUND = "*" // 用*作为通配符捕获所有未匹配路由
    }
}

步骤2:在NavHost中添加兜底路由

把404的composable放在所有路由的最后,确保它是最后被匹配的规则:

NavHost(
    navController = nav,
    startDestination = NavRoutes.Splash.route,
) {
    composable(NavRoutes.Home.route) {
        To(nav = nav, Request.Home(ctx = ctx))
    }
    // 其他已实现的路由...
    
    // 404兜底路由,必须放在最后
    composable(NavRoutes.Errors.NOT_FOUND) { backStackEntry ->
        // 获取用户访问的错误路由地址
        val invalidRoute = backStackEntry.destination.route 
            ?: navController.previousBackStackEntry?.destination.route
            ?: "未知路径"
        
        To(nav = nav, Request.Error(route = invalidRoute))
    }
}

关键注意事项

  • 通配符顺序不能乱:Navigation会按路由定义的顺序匹配,兜底路由必须放在所有已实现路由的后面,否则会优先匹配到它,导致正常路由无法访问。
  • 路由来源捕获:通过backStackEntry.destination.route可以拿到触发404的具体路由,也可以结合previousBackStackEntry获取更准确的跳转来源。
  • 减少无效跳转:尽量让所有按钮/链接使用NavRoutes中定义的常量,避免手动输入错误路由的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:05:27