将参数传递给 Jetpack Compose 中的嵌套导航图

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().

我所描述的可能是不可能的,但期待任何人的想法!

Vin*_*man 6

更新: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 中再次进行导航,我看到了另一个选项,它确实有参数参数。

  • 我发现。要使用参数正确使用“navigation()”,请使用“import androidx.navigation.compose.navigation”而不是在 navigation-compose v2.6.0 上检查的“import androidx.navigation.navigation” (3认同)

wrs*_*rsx 2

您可以从子可组合项访问图形参数:

navController.getBackStackEntry("dashboard?classId={classId}").arguments?.getString("classId")
Run Code Online (Sandbox Code Playgroud)