Sea*_*ean 5 android android-jetpack-navigation android-jetpack-compose
我会尝试做一些 ASCII 艺术来描述这个问题:
<--------------------------------------\
DestinationA --> DestinationC ---------> DestinationE
DestinationB ------/ \-----> DestinationD --/
Run Code Online (Sandbox Code Playgroud)
我希望这是可以解读的。可以从目的地 A 和 B 到达 C。可以从 C 和 D 到达 E。E 返回到 A 或 B(以返回堆栈中的为准)。目的地 C、D 和 E 采用参数 (id)。
实现这一点的最佳方法是什么?使用嵌套导航图看起来是可能的。
以下内容有效,但感觉更像是一种解决方法,而不是导航组件的预期工作方式。
<--------------------------------------\
DestinationA --> DestinationC ---------> DestinationE
DestinationB ------/ \-----> DestinationD --/
Run Code Online (Sandbox Code Playgroud)
NavHost 目前的使用情况是:
val destination = navController.getBackStackEntry("DestinationC/{id}").destination
navController.popBackStack(destination.id, true)
Run Code Online (Sandbox Code Playgroud)
@rofie-sagara 的答案对我不起作用。有一个支持路线的导航扩展。我认为嵌套导航是一个不相关的主题。这些文档并没有真正解释为什么嵌套导航实际上很有用。我从 E 回到 A 或 B 的最终解决方案是:
navigation.popBackStack(route = "DestinationC/{id}", inclusive = true)
Run Code Online (Sandbox Code Playgroud)
Rof*_*ara -1
使用嵌套导航图制作DestinationC和DestinationE差异导航。
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "DestinationA") {
compose("DestinationA") {
ScreenA(hiltNavGraphViewModel(it))
}
compose("DestinationB") {
ScreenB(hiltNavGraphViewModel(it))
}
navigation("DestinationC".plus("/{id}"), "DestinationC".plus("_Route")) {
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)
}
navigation("DestinationE".plus("/{id}"), "DestinationE".plus("_Route")) {
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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
例如,您想要从 C 移动到 E,然后弹出到 A。
navController.navigate("DestinationE".plus("/${data.id}")) {
popUpTo("DestinationA") {
inclusive = false
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5358 次 |
| 最近记录: |