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

嵌套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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:33:26