gpt4 book ai didi

android - 如何从嵌套的可组合 Jetpack Compose 访问 NavHostController

转载 作者:行者123 更新时间:2023-12-04 13:27:55 27 4
gpt4 key购买 nike

假设我的应用程序看起来像这样

@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")
}) {
...
}
}

最佳答案

用撰写1.0.0-beta04和导航1.0.0-alpha10正如 official doc 所建议的那样

  • 传递应该由可组合导航触发的 lambda,而不是 NavController本身。
  •     @Composable
    fun ChildCompose(
    navigateTo: () -> Unit
    ) {
    //...
    navigateTo
    }
    并使用它:
    ChildCompose(navigateTo = {
    navController.navigate("...")
    })
    这样 ChildCompose可组合作品独立于 Navigation

    关于android - 如何从嵌套的可组合 Jetpack Compose 访问 NavHostController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67059823/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com