Jetpack Compose中如何从子NavHost导航至根导航图页面?
错误原因
你当前使用的是HomeScreen内部的子NavHostController,它仅能识别Home内部的导航图,无法找到根导航图中的Screen.Start.route,因此抛出找不到导航目标的异常。
解决方案步骤
1. 修改HomeScreen,接收根导航控制器
调整HomeScreen的参数,新增根导航控制器的入参,同时保留自己的子控制器用于底部导航:
@Composable fun HomeScreen(rootNavController: NavHostController) { // 保留Home内部底部导航用的子控制器 val homeNavController = rememberNavController() Scaffold( bottomBar = { TabBar(navHostController = homeNavController) } ) { innerPadding -> Box(modifier = Modifier.padding(innerPadding)) { HomeNavGraph(navController = homeNavController) } } }
2. 在根导航图中传递根控制器
更新RootNavigationGraph中调用HomeScreen的代码,传入根导航的navController:
@Composable fun RootNavigationGraph(navController: NavHostController) { NavHost( navController = navController, route = "root_graph", startDestination = Screen.Welcome.route ) { // ... 其他可组合项代码不变 composable(route = Screen.Home.route) { // 传入根导航控制器 HomeScreen(rootNavController = navController) } } }
3. 使用根控制器完成跨图跳转并清空回栈
在HomeScreen内部需要跳转的可组合项中,使用rootNavController执行导航,同时清空根导航的回栈:
// 示例:在Home内部的某个按钮点击事件中 rootNavController.navigate(Screen.Start.route) { // 清空根导航图的所有回栈,inclusive=true表示连根图本身也弹出 popUpTo("root_graph") { inclusive = true } }
如果希望保留根导航图的结构,仅清空到Screen.Start.route之前的页面,可以调整popUpTo的参数:
rootNavController.navigate(Screen.Start.route) { popUpTo(Screen.Start.route) { inclusive = false } // 确保不会重复添加StartScreen到栈中 launchSingleTop = true }
内容的提问来源于stack exchange,提问作者WhichonesPi
相关产品推荐
相关产品推荐

