首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jetpack组合+导航:从不同的BottomBar屏幕导航到BottomBar目的地

Jetpack组合+导航:从不同的BottomBar屏幕导航到BottomBar目的地
EN

Stack Overflow用户
提问于 2022-03-10 16:18:27
回答 2查看 551关注 0票数 2

问题:

BottomBar有4个目的地:ScreenA、ScreenB、ScreenC和ScreenD。

在ScreenA上按下按钮(不是下栏项)时,我想使用参数转到ScreenB。

代码:

NavGraph

代码语言:javascript
复制
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(...)
        }
    }
}

BottomBar

代码语言:javascript
复制
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,但是param值始终为0,因为我永远不会传递在navToScreenB lambda中传递的arg。我使用的是compose_version =‘1.2.0-alpha 04’和compose_version

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-08 17:09:53

结果表明,路由中的{param}navArgument({param})必须完全相同,即使路径看起来正确并且路由中有args。

票数 0
EN

Stack Overflow用户

发布于 2022-09-28 01:00:46

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

代码语言:javascript
复制
navController.navigate(item.screen.route) {
  navController.graph.startDestinationRoute?.let { route ->
    popUpTo(route) { saveState = true }
  }
  launchSingleTop = true
  restoreState = true
}

然后,您还应该在其他地方执行相同的参数,这时需要对BottomNavigationItem进行更改。

代码语言:javascript
复制
navController.graph.startDestinationRoute?.let { route ->
  popUpTo(route) { saveState = true }
}
launchSingleTop = true
restoreState = true
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71427418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档