android - 如何使用 Jetpack Compose Navigation 处理弹出多个屏幕
问题描述
我会尝试做一些 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)
}
}
解决方案
@rofie-sagara 的答案对我不起作用。有一个支持路线的导航扩展。我认为嵌套导航是一个不相关的话题。文档并没有真正解释为什么嵌套导航实际上很有用。我从 E 移回 A 或 B 的最终解决方案是:
navigation.popBackStack(route = "DestinationC/{id}", inclusive = true)
推荐阅读
- node.js - 如何识别正在执行哪种类型的自定义身份验证?
- vue.js - 无法选择第三方 Vue 插件生成的元素
- c - 无论如何要创建一个 if 语句来打印一个输出,说明我已经超过了多少公斤?
- selenium-webdriver - 如何用 selenium 和 java 修复这个 NullPointerException?
- java - 我的 CloudWatch 日志中缺少 AWSRequestId
- anypoint-studio - 如何在 Mulesoft 4 中使用 dataweave 获取流中的当前路径?
- c# - asp mvc core 3 自定义属性验证的客户端验证
- c++ - 使用不同的 clang 格式版本统一输出
- python - Jupyter notebook 使用 numpy 导入其他 .py 文件不起作用
- php - 发布可以被多个页面访问的数据