eHe*_*ero 9 android android-jetpack-compose jetpack-compose-navigation
从文档中,我看到您可以像这样嵌套导航图:
NavHost(navController, startDestination = "home") {
...
// Navigating to the graph via its route ('login') automatically
// navigates to the graph's start destination - 'username'
// therefore encapsulating the graph's internal routing logic
navigation(startDestination = "username", route = "login") {
composable("username") { ... }
composable("password") { ... }
composable("registration") { ... }
}
...
}
Run Code Online (Sandbox Code Playgroud)
我想知道,如何在路线中传递参数,并使其可供导航图中的所有可组合项使用?
这是我当前的导航图:
navigation(
// I'd like to grab this parameter
route = "dashboard?classId={classId}",
startDestination = Route.ScreenOne.route) {
composable(Route.ScreenOne.route) {
// And then pass the parameter here, or to any composable below
ScreenOne(classId)
}
composable(Route.ScreenTwo.route) {
ScreenTwo()
}
composable(Route.ScreenThree.route) {
ScreenThree()
}
}
Run Code Online (Sandbox Code Playgroud)
我基本上试图避免在每个可组合路线上单独设置 classId 导航参数。我没有找到一种方法navigation()可以像在composable().
我所描述的可能是不可能的,但期待任何人的想法!
更新:2023 年 4 月 6 日 - 之前我的答案已被破坏。我现在已经更新了它以从导航控制器获取返回堆栈条目。该解决方案现在有效。
是的,这是完全可能的 - 由于缺乏文档,我花了一段时间(它们解释了导航参数和嵌套图,但不是两者都解释!)。
您将需要访问您的navController才能执行此操作。
您调用getBackStackEntrynavController 来获取最顶部的条目。remember(entry) { }当您在可组合项中调用它时,它需要包装在一个块中。
private fun NavGraphBuilder.yourNestedGraph(navController: NavHostController) {
navigation(
route = "dashboard?classId={classId}",
startDestination = "yourStartDestination",
arguments = listOf(navArgument("classId") { type = NavType.StringType })
) {
composable(route = "yourStartDestination") { entry ->
val parentEntry = remember(entry) { navController.getBackStackEntry("dashboard?classId={classId}") }
val classId = parentEntry.arguments?.getString("classId")
YourScreenComposable(classId)
}
composable(route = "someOtherNestedRoute") { entry ->
val parentEntry = remember(entry) { navController.getBackStackEntry("dashboard?classId={classId}") }
val classId = parentEntry.arguments?.getString("classId")
AnotherScreen(classId)
}
composable(route = "andAnotherNestedRoute") { entry ->
val parentEntry = remember(entry) { navController.getBackStackEntry("dashboard?classId={classId}") }
val classId = parentEntry.arguments?.getString("classId")
AndAnotherScreen(classId)
}
}
}
Run Code Online (Sandbox Code Playgroud)
**重要提示** - 您可能需要再次输入导航函数并导入它 - 与问题中提到的问题类似,我一开始也无法在现有的导航函数中看到参数参数,但是当我输入在我的 NavGraphBuilder 中再次进行导航,我看到了另一个选项,它确实有参数参数。
您可以从子可组合项访问图形参数:
navController.getBackStackEntry("dashboard?classId={classId}").arguments?.getString("classId")
Run Code Online (Sandbox Code Playgroud)