【问题标题】:Jetpack Compose + Navigation: navigating to to BottomBar destination from different BottomBar screenJetpack Compose + Navigation:从不同的 BottomBar 屏幕导航到 BottomBar 目的地
【发布时间】:2022-09-28 09:00:46
【问题描述】:

问题:

底栏有 4 个目的地:ScreenA、Screen、ScreenS 和 ScreenS。

在屏幕上按下按钮(不是底部栏项目)时,我想使用参数进入屏幕。

代码:

导航图

AnimatedNavHost(navController = navController, startDestination = \"screen_a\") {
    composable(\"screen_a\") {
        ScreenA(navToScreenB = {
            navController.navigate(\"screen_b?param=1\") {
        })
    }
    navigation(
        route = \"screen_b\",
        startDestination = \"screen_b?param={param}\",
    ) {
        composable(
            route = \"screen_b?param={param}\",
            arguments = listOf(navArgument(\"param\") { type = NavType.IntType })
        ) { backStackEntry ->
            val param =  backStackEntry.arguments?.getBoolean(\"param\") ?: 0
            ScreenB(param = param)
        }
        composable(route = \"screen_b/details\") {
            ScreenB_details(...)
        }
    }
}

底栏

fun BottomNavigation(navController: NavController, selectedNavigation: Screen) {
    val items = listOf(...)
    BottomNavigation(
        backgroundColor = MaterialTheme.colors.primary
    ) {
        items.forEach { item -> BottomNavigationItem(
                onClick = {
                    navController.navigate(item.screen.route) {
                        navController.graph.startDestinationRoute?.let { route ->
                            popUpTo(route) { saveState = true }
                        }
                        launchSingleTop = true
                        restoreState = true
                    }
                }
            )
        }
    }
}

到目前为止,单击 ScreenA 上的按钮将我导航到 ScreenB,但参数值始终为 0,因为我永远不会传递在 navToScreenB lambda 中传递的 arg。 我正在使用 compose_version = \'1.2.0-alpha04\' 和 \"androidx.navigation:navigation-compose:2.5.0-alpha03\"

    标签: android android-jetpack-compose jetpack-compose-navigation


    【解决方案1】:

    结果证明 {param} in route 和 navArgument({param}) 必须完全相同,即使路径看起来正确并且在 route 中有 args

    【讨论】:

    • 你能详细说明吗?我有一点不同的问题,当我使用屏幕按钮从一个屏幕导航到另一个屏幕时,我无法再返回到 screenA。点击导航项目触发屏幕:(
    • @PiotrPrus 听起来你没有在 ScreenB BackHandler { navController.navigateUp() } 中设置后处理程序
    • 在这种情况下,我没有使用后退按钮。
    【解决方案2】:

    要详细说明上面@Kamil 的答案,如果您在BottomNavigationItem.onClick 中这样做

    navController.navigate(item.screen.route) {
      navController.graph.startDestinationRoute?.let { route ->
        popUpTo(route) { saveState = true }
      }
      launchSingleTop = true
      restoreState = true
    }
    

    然后,当打算更改 BottomNavigationItem 时,您还应该在其他地方执行相同的参数。

    navController.graph.startDestinationRoute?.let { route ->
      popUpTo(route) { saveState = true }
    }
    launchSingleTop = true
    restoreState = true
    

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2022-10-23
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 2022-11-07
      • 2018-08-04
      • 2021-08-27
      • 1970-01-01
      相关资源
      最近更新 更多