Kreisförmige Navigation

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:

Eine Demonstration der kreisförmigen Navigation
Abbildung 1: Ein kreisförmiges Navigationsdiagramm mit drei Zielen: A, B und C.

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>