Jetpack Compose嵌套导航设置启动目标报错求助
问题描述
我在Composable组件中试验Jetpack Compose嵌套导航,已创建Intent和包含如下Composable函数的Activity:
// @Composable val navController = rememberNavController() NavHost( navController = navController, startDestination = "product/feature1" ) { navigation( startDestination = "feature1", route = "product" ) { navigation( startDestination = "main", route = "feature1" ) { composable(route = "main") { MainScreen() } } } }
尝试将startDestination设为"product/feature1"以导航至主屏幕时,抛出如下异常:
java.lang.IllegalArgumentException: navigation destination product/feature1 is not a direct child of this NavGraph
androidx.navigation.NavGraphNavigator.navigate(NavGraphNavigator.kt:72)
问题原因
NavHost的根NavGraph直接子节点是"product"这个嵌套导航,"product/feature1"是"product"导航节点的子节点,并非根NavGraph的直接子节点,直接将其设为根NavHost的startDestination会触发异常。
解决方案
方式一:使用最外层嵌套导航作为根startDestination
把根NavHost的startDestination改为"product",由于"product"导航内部已设置startDestination = "feature1",而"feature1"导航又设置了startDestination = "main",启动时会自动层层导航到MainScreen:
// @Composable val navController = rememberNavController() NavHost( navController = navController, startDestination = "product" // 修改此处 ) { navigation( startDestination = "feature1", route = "product" ) { navigation( startDestination = "main", route = "feature1" ) { composable(route = "main") { MainScreen() } } } }
方式二:直接指定最终页面的完整路由
如果需要直接跳转到MainScreen,可以使用完整嵌套路由"product/feature1/main"作为根NavHost的startDestination,这种方式需要确保路由路径完全匹配层级结构,但更推荐第一种方式,符合嵌套导航的层级设计逻辑。
内容的提问来源于stack exchange,提问作者keyboard_user

