【问题标题】:Compose navigation: How to avoid to add the current destination to the back queue once you navigate out of it?组合导航:如何避免在导航出当前目的地后将其添加到后台队列?
【发布时间】:2023-02-25 22:07:37
【问题描述】:
用例如下:
- 我有一个已经有几个目的地的后排队列。
? -> ... -> ?
- 一个新的目的地,我们称之为 Foo 屏幕,显示并且当前位于顶部。
? -> ... -> ? -> F
- 我想从 Foo 屏幕导航到新的 Bar 屏幕,但根据特定条件,当导航返回时我想返回 Foo 屏幕或跳过 Foo 屏幕并直接转到之前的屏幕队列。
if (skipFoo)
? -> ... -> ? -> B
else
? -> ... -> ? -> F -> B
这可以使用 androidx.navigation 中的 NavOptionsBuilder 来实现吗?
我知道我可以使用 popUpTo(0) { inclusive = true } 从堆栈中删除除新目的地以外的所有内容,但我只想防止在我导航出当前屏幕时添加当前屏幕,并且只有在满足特定条件时才添加。
此外,目的地堆栈的内容是动态的(可以随时添加 Foo 屏幕)所以我不能简单地用固定目的地硬编码 popUpToId,因为我不知道之前的目的地是什么堆栈上的 Foo 屏幕。
【问题讨论】:
标签:
android-jetpack-compose
android-jetpack-navigation
jetpack-compose-navigation
【解决方案1】:
可以使用popUpTo来完成:
navController.navigate(Screens.Bar.route) {
popUpTo(Screens.Foo.route) {
inclusive = true
}
}
【解决方案2】:
它可以通过以下代码来实现。它帮助了我。
示例 1:
在导航到“朋友列表”目的地之前,将所有内容从返回堆栈弹出到“家”目的地
navController.navigate("friendslist") {
popUpTo("home")
}
示例 2:
在导航到“朋友列表”目的地之前,将包括“家”目的地在内的所有内容都从返回堆栈中弹出
navController.navigate("friendslist") {
popUpTo("home") { inclusive = true }
}
示例 3:
只有当我们不在“搜索”目的地时才导航到“搜索”目的地,避免在返回堆栈顶部出现多个副本
navController.navigate("search") {
launchSingleTop = true
}
参考资料:https://developer.android.com/jetpack/compose/navigation