Ein klares Beispiel dafür, wo Sie zu einem Ziel zurückkehren müssen, ist eine kreisförmige Navigation. In diesem Dokument wird dieser Anwendungsfall beschrieben.
Szenario
Angenommen, Ihre App hat drei Ziele: A, B und C. Es gibt auch Aktionen, die von A nach B, B nach C und C zurück zu A führen. Das entsprechende Navigationsdiagramm sieht so aus:
Bei jeder Navigationsaktion fügt NavController
das neue Ziel dem Back-Stack hinzu. Wenn also wiederholt durch den Ablauf im Diagramm navigiert wird, würde Ihr Back-Stack mehrere Sätze jedes Ziels enthalten: A, B, C, A, B, C, A, B, C.
Die Lösung
Um Wiederholungen im Back-Stack zu vermeiden, geben Sie im Aufruf von NavController.navigate()
oder in der Navigationsaktion popUpTo()
und inclusive
an.
Nehmen wir einen Fall, bei dem der Back-Stack nach dem Erreichen von Ziel C eine Instanz jedes Ziels enthält: A, B, C. In der Aktion oder im Aufruf an navigate()
, die den Nutzer von Ziel C zu Ziel A leitet, müssen popUpTo()
und inclusive
definiert sein.
Wenn der Nutzer in diesem Fall von Ziel C zurück zu Ziel A navigiert, wird NavController
auch in A angezeigt. Das bedeutet, dass B und C aus dem Stack entfernt werden. Mit inclusive = true
wird auch das erste A hervorgehoben, wodurch der Stapel geleert wird.
„Compose-Implementierung“
Im Folgenden sehen Sie die Implementierung der Lösung für zirkuläre popUpTo()
in Composer:
// When creating your `NavGraph` in your `NavHost`.
composable("c") {
DestinationC(
onNavigateToA = {
navController.navigate("a") {
popUpTo("a") {
inclusive = true
}
}
},
)
}
Ansichten implementieren
Im Folgenden sehen Sie die Implementierung der Lösung für das Kreislaufprinzip popUpTo
in Views:
<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>