【发布时间】:2021-11-06 23:24:34
【问题描述】:
我在我的新 Jetpack Compose 应用程序中设置了一个底部栏,其中包含 2 个目的地。我已尝试遵循 Google 提供的示例。
例如,它看起来像这样:
@Composable
fun MyBottomBar(navController: NavHostController) {
val items = listOf(
BottomNavigationScreen.ScreenA,
BottomNavigationScreen.ScreenB
)
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentDestination = navBackStackEntry?.destination
BottomNavigation {
items.forEach { screen ->
BottomNavigationItem(
onClick = {
navController.navigate(screen.route) {
popUpTo(navController.graph.findStartDestination().id) {
saveState = true
}
launchSingleTop = true
restoreState = true
}
},
selected = currentDestination?.hierarchy?.any { it.route == screen.route } == true,
icon = { Icon(imageVector = screen.icon, contentDescription = null) },
label = { Text(stringResource(screen.label)) }
)
}
}
}
这一切都很好,我可以在两个目的地之间导航。但是,我也有一个指向 ScreenB 的深层链接。一旦被调用,按下 ScreenA 按钮似乎什么都不做(如果我添加日志记录,我可以看到 currentDestination 被重复设置为 ScreenB)但按下返回返回到 ScreenA 的 startDestination。
我目前的解决方法是从示例代码中删除 restoreState = true 行。
我的怀疑是关于深层链接的某些东西正在持续存在,尽管它试图转到 ScreenA,但导航组件说它有一个指向 ScreenB 的深层链接,所以它就去了那里。我尝试重置活动意图,使其在意图中没有标志和数据,我什至尝试更改意图操作类型,但都无济于事。
我正在使用 Compose 1.0.0-rc02 和 Compose Navigation 2.4.0-alpha04。
是我做错了什么还是这是一个错误?
【问题讨论】:
-
你找到解决办法了吗?
-
不。我现在正在使用 Compose 1.0.0 和 Compose Navigation 2.4.0-alpha08,但问题仍然存在。我必须在没有保存/恢复状态的情况下继续
-
这种行为让我发疯:P 经过一些测试,我发现了一些非常奇怪的东西,我可以很容易地重现。深度链接调用后,我的“屏幕 A”菜单点变为“屏幕 B”。我的意思是,我观察到“navController.currentBackStackEntryFlow”,它为其他菜单点返回了良好的值(在我的情况下,我有 4 个),但主菜单点“损坏”并且像第二个菜单点一样。
-
那么听起来肯定像一个错误 - 不是错误的使用。我将在深度链接之前和之后查看自己的回栈条目。你的底栏在你按下后是否开始正常工作?
-
是的,之后backstack就可以正常工作了。
标签: deep-linking android-jetpack-compose android-architecture-navigation