如何从嵌套的可组合 Jetpack Compose 访问 NavHostController
How to acess NavHostController from nested composable Jetpack Compose
假设我的应用程序看起来像这样
@Composable
fun AppNavigation() {
val navController = rememberNavController()
NavHost(navController, startDestination = Route.Home.route) {
/// other composes
composable("Home") { HomeCompose(navController) }
}
}
@Composable
fun HomeCompose(navController: NavHostController) {
ChildCompose(navController)
}
@Composable
fun ChildCompose(navController: NavHostController) {
navController.navigate("")
}
我想访问嵌套可组合项中的 navController 以进行导航
但我不想像上面那样将 navController 从父可组合传递给子可组合
是否可以从 NavHost 内部的任何地方访问 navController 而无需通过可组合层次结构传递它
编辑:现在,我可以使用 CompositionLocalProvider 访问嵌套组合中的 navController,如下所示
val AppNavController = compositionLocalOf<NavHostController>() { error("NavHostController error") }
@Composable
fun AppNavigation() {
val navController = rememberNavController()
CompositionLocalProvider(
AppNavController provides navController
) {
NavHost(navController, startDestination = Route.Home.route) {
/// other composes
composable("Home") { HomeCompose() }
}
}
}
@Composable
fun HomeCompose() {
ChildCompose()
}
@Composable
fun ChildCompose(navController: NavHostController) {
val navController = AppNavController.current
Column(modifier = Modifier.clickable {
navController.navigate("Content")
}) {
...
}
}
根据 official doc
的建议使用撰写 1.0.0-beta04
和导航 1.0.0-alpha10
- 传递应该由可组合项触发的 lambda 来导航,而不是
NavController
本身。
@Composable
fun ChildCompose(
navigateTo: () -> Unit
) {
//...
navigateTo
}
并使用它:
ChildCompose(navigateTo = {
navController.navigate("...")
})
这样 ChildCompose
可组合项独立于 Navigation
假设我的应用程序看起来像这样
@Composable
fun AppNavigation() {
val navController = rememberNavController()
NavHost(navController, startDestination = Route.Home.route) {
/// other composes
composable("Home") { HomeCompose(navController) }
}
}
@Composable
fun HomeCompose(navController: NavHostController) {
ChildCompose(navController)
}
@Composable
fun ChildCompose(navController: NavHostController) {
navController.navigate("")
}
我想访问嵌套可组合项中的 navController 以进行导航 但我不想像上面那样将 navController 从父可组合传递给子可组合
是否可以从 NavHost 内部的任何地方访问 navController 而无需通过可组合层次结构传递它
编辑:现在,我可以使用 CompositionLocalProvider 访问嵌套组合中的 navController,如下所示
val AppNavController = compositionLocalOf<NavHostController>() { error("NavHostController error") }
@Composable
fun AppNavigation() {
val navController = rememberNavController()
CompositionLocalProvider(
AppNavController provides navController
) {
NavHost(navController, startDestination = Route.Home.route) {
/// other composes
composable("Home") { HomeCompose() }
}
}
}
@Composable
fun HomeCompose() {
ChildCompose()
}
@Composable
fun ChildCompose(navController: NavHostController) {
val navController = AppNavController.current
Column(modifier = Modifier.clickable {
navController.navigate("Content")
}) {
...
}
}
根据 official doc
的建议使用撰写1.0.0-beta04
和导航 1.0.0-alpha10
- 传递应该由可组合项触发的 lambda 来导航,而不是
NavController
本身。
@Composable
fun ChildCompose(
navigateTo: () -> Unit
) {
//...
navigateTo
}
并使用它:
ChildCompose(navigateTo = {
navController.navigate("...")
})
这样 ChildCompose
可组合项独立于 Navigation