【发布时间】:2021-05-01 12:12:27
【问题描述】:
我会尝试做一些 ASCII 艺术来描述这个问题:
<--------------------------------------\
DestinationA --> DestinationC ---------> DestinationE
DestinationB ------/ \-----> DestinationD --/
我希望这是可以理解的。 C 可以从目的地 A 和 B 到达。E 可以从 C 和 D 到达。E 返回到 A 或 B(无论哪个在后堆栈中)。目的地 C、D 和 E 接受一个参数 (id)。
实现这一点的最佳方法是什么?使用嵌套导航图似乎是可能的。
以下内容有效,但感觉更像是一种变通方法,而不是导航组件的预期工作方式。
val destination = navController.getBackStackEntry("DestinationC/{id}").destination
navController.popBackStack(destination.id, true)
目前使用NavHost是:
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "DestinationA") {
compose("DestinationA") {
ScreenA(hiltNavGraphViewModel(it))
}
compose("DestinationB") {
ScreenB(hiltNavGraphViewModel(it))
}
compose("DestinationC/{id}", arguments = listOf(navArgument("id") { type = NavType.StringType })) {
val viewModel = hiltNavGraphViewModel(it)
val id = it.arguments?.getString("id")
viewModel.setId(id)
ScreenC(viewModel)
}
compose("DestinationD/{id}", arguments = listOf(navArgument("id") { type = NavType.StringType })) {
val viewModel = hiltNavGraphViewModel(it)
val id = it.arguments?.getString("id")
viewModel.setId(id)
ScreenD(viewModel)
}
compose("DestinationE/{id}", arguments = listOf(navArgument("id") { type = NavType.StringType })) {
val viewModel = hiltNavGraphViewModel(it)
val id = it.arguments?.getString("id")
viewModel.setId(id)
ScreenE(viewModel)
}
}
【问题讨论】:
-
DestinationA&DestinationB应该是两个不同的startDestination?如果是,那么使用了什么组件 bottomNav、Tabs 或其他什么? -
我承认对导航的理解不是很深。也许
DestinationA和DestinationB应该不同startDestination,但它们不是。我有一个公寓NavHost,里面有所有的目的地,DestinationA是startDestination。我正在使用导航抽屉。这会改变我应该如何设计导航吗?如果是这样,怎么做?谢谢。 -
能否请您发布您当前的导航图以及 SS 也会有所帮助。
DestinationA&DestinationB属于哪里?它们是抽屉的方向物品吗? -
是的,DestinationA 和 DestinationB 是抽屉中的顶级目的地。导航图完全无趣。我将编辑问题以使其格式正确。
标签: android android-jetpack-compose android-jetpack-navigation