当您的导航是循环的时,您需要返回到某个目的地的一个清晰示例。本文档概述了该用例。
场景
假设您的应用有三个目的地:A、B 和 C。它还有一些操作,从 A 到 B,从 B 到 C,从 C 返回到 A。相应的导航图如下所示
对于每个导航操作,NavController
将新的目的地添加到回退堆栈中。因此,在图中反复导航会导致您的回退堆栈包含多个目的地集:A、B、C、A、B、C、A、B、C。
解决方案
为了避免回退堆栈中的重复,请在调用 NavController.navigate()
或在导航操作中指定 popUpTo()
和 inclusive
。
考虑这样一种情况,在到达目的地 C 后,回退堆栈包含每个目的地的一个实例:A、B、C。您需要确保您在操作或调用 navigate()
中定义了 popUpTo()
和 inclusive
,该操作或调用将用户从目的地 C 带到目的地 A。
在这种情况下,当用户从目的地 C 导航回目的地 A 时,NavController
也会弹出到 A。这意味着它会从堆栈中删除 B 和 C。使用 inclusive = true
,它还会弹出第一个 A,有效地清除堆栈。
Compose 实现
以下是 Compose 中循环 popUpTo()
解决方案的实现
// When creating your `NavGraph` in your `NavHost`.
composable("c") {
DestinationC(
onNavigateToA = {
navController.navigate("a") {
popUpTo("a") {
inclusive = true
}
}
},
)
}
视图实现
以下是视图中循环 popUpTo
解决方案的实现
<fragment
android:id="@+id/c"
android:name="com.example.myapplication.C"
android:label="fragment_c"
tools:layout="@layout/fragment_c">
<action
android:id="@+id/action_c_to_a"
app:destination="@id/a"
app:popUpTo="@+id/a"
app:popUpToInclusive="true"/>
</fragment>