Jetpack Compose混合默认与普通参数导航报错,求代码排查
Jetpack Compose导航中默认参数与普通参数结合的问题排查与修复
核心错误:路由路径不匹配
你的代码存在路由基础路径不一致的致命问题:
Screens.AssignScreen的路由定义为"assign_screen/{${Constants.TRIP_ID}}?dockId={${Constants.DOCK_ID}}"- 但
passTripAndDockId方法返回的路径是"assign_dock_screen/$tripId?dockId=$dockId"
两者基础路径分别是assign_screen和assign_dock_screen,导航时系统找不到对应目的地,直接抛出IllegalArgumentException。
其他需修正的细节
- 可选参数配置冲突:你给
dockId同时设置了defaultValue = ""和nullable = true,逻辑矛盾——已有默认空字符串,无需允许参数为null,建议移除nullable = true。 - 参数获取优化:获取必填参数
tripId时,不需要用?.getString()?.toString(),可以用requireNotNull确保非空,避免潜在空指针问题。
修正后的完整代码
Screens对象代码
object AssignScreen : Screens("assign_screen/{${Constants.TRIP_ID}}?dockId={${Constants.DOCK_ID}}") { fun passTripAndDockId(tripId: String, dockId: String = ""): String { // 修正路径名称,与路由定义保持一致 return "assign_screen/$tripId?dockId=$dockId" } }
NavGraph代码
composable( Screens.AssignScreen.route, arguments = listOf( navArgument(Constants.TRIP_ID) { type = NavType.StringType }, navArgument(Constants.DOCK_ID) { defaultValue = "" type = NavType.StringType // 移除不必要的nullable配置 } ) ) { backStackEntry -> // 优化参数获取逻辑 val tripId = requireNotNull(backStackEntry.arguments?.getString(Constants.TRIP_ID)) val dockId = backStackEntry.arguments?.getString(Constants.DOCK_ID) ?: "" // 页面业务逻辑 }
导航调用代码
navController.navigate(Screens.AssignScreen.passTripAndDockId(tripId = trip.id))
内容的提问来源于stack exchange,提问作者Ashish Gautam
相关产品推荐
相关产品推荐

