如何在Jetpack Compose中添加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
相关产品推荐
相关产品推荐

