嵌套NavGraph中从Dashboard跳转至TrackingGraph报错的解决咨询
问题分析与解决方案
错误原因
核心问题是导航控制器作用域不匹配:
MainScreen内部创建了独立的rememberNavController(),这是底部导航的子导航控制器,它的导航图仅包含dashboardGraph、orderGraph、profileGraph,完全不知道根导航里的trackingGraph。- 用子导航控制器跳转根导航的目标,自然找不到匹配节点,触发
IllegalArgumentException。
修复步骤
1. 传递根导航控制器到MainScreen
修改RootNavigationGraph中MainScreen的调用,把根导航的navController传入:
@Composable fun RootNavigationGraph(navController: NavHostController) { NavHost( navController = navController, startDestination = RootScreen.Welcome.route, ) { welcomeGraph(navController) authGraph(navController) composable(route = RootScreen.Main.route) { // 传递根导航控制器 MainScreen(rootNavController = navController) } trackingGraph(navController) } }
2. 修改MainScreen区分根/子导航控制器
MainScreen保留自己的子导航控制器处理底部导航,同时用根控制器处理跨导航图跳转:
@Composable fun MainScreen(rootNavController: NavController) { // 子导航控制器,负责底部导航切换 val bottomNavController = rememberNavController() val listThatShowWithBottomNav = listOf( ChildScreen.Dashboard.route, ChildScreen.Profile.route, ChildScreen.Order.route ) val currentSelectedScreen by bottomNavController.currentScreenAsState() val currentRoute by bottomNavController.currentRouteAsState() AppScaffold( modifier = Modifier.systemBarsPadding(), bottomBar = { if (currentRoute != null && listThatShowWithBottomNav.contains(currentRoute)) { BottomNavBar( navController = bottomNavController, currentSelectedScreen = currentSelectedScreen ) } }, // 其余Scaffold代码保持不变 ) { NavHost( navController = bottomNavController, startDestination = RootScreen.Dashboard.route, route = RootScreen.Main.route ) { // 给dashboardGraph传递根控制器用于跳转tracking dashboardGraph(rootNavController) orderGraph(bottomNavController) profileGraph(bottomNavController) } } }
3. 调整dashboard跳转逻辑使用根控制器
用根导航控制器跳转根导航里的trackingGraph:
private fun NavGraphBuilder.dashboardCHILD(rootNavController: NavController) { composable(route = ChildScreen.Dashboard.route) { DashboardScreen( onNavigateToTracking = { rootNavController.navigate(RootScreen.Tracking.route) }, onNavigateToFeature = { } ) { } } }
额外验证
确保RootScreen.Tracking.route的路由值和trackingGraph的根路由完全一致,例如:
enum class RootScreen(val route: String) { // 其他枚举项 Tracking("tracking_root") } // trackingGraph定义示例 private fun NavGraphBuilder.trackingGraph(navController: NavController) { navigation( route = RootScreen.Tracking.route, startDestination = "tracking_home" ) { // tracking相关目的地 } }
内容的提问来源于stack exchange,提问作者Yuba
相关产品推荐
相关产品推荐

