Nawigacja kołowa

Jasnym przykładem tego, gdzie trzeba wrócić do celu, jest nawigacja kołowa. W tym dokumencie opisujemy ten przypadek użycia.

Scenariusz

Załóżmy, że Twoja aplikacja ma 3 miejsca docelowe: A, B i C. Zawiera też działania prowadzące od punktu A do B, B do C i C z powrotem do A. Odpowiedni wykres nawigacyjny będzie wyglądał tak:

prezentacja nawigacji kołowej.
Rysunek 1. Okrągły wykres nawigacyjny z 3 miejscami docelowymi: A, B i C.

Przy każdym działaniu nawigacyjnym NavController dodaje nowe miejsce docelowe do stosu wstecznego. W związku z tym wielokrotne poruszanie się po schemacie spowoduje, że stos wsteczny zawierałby wiele zbiorów każdego miejsca docelowego: A, B, C, A, B, C, A, B, C.

Rozwiązanie

Aby uniknąć powtórzeń w stosie wstecznym, w wywołaniu do NavController.navigate() lub w działaniu nawigacyjnym wskaż popUpTo() i inclusive.

Przeanalizujmy przypadek, w którym po dotarciu do miejsca docelowego C stos wsteczny zawiera jedno wystąpienie każdego miejsca docelowego: A, B, C. Musisz upewnić się, że w działaniu lub wywołaniu navigate() są zdefiniowane parametry popUpTo() i inclusive, które przenoszą użytkownika z miejsca docelowego C do miejsca docelowego A.

W tym przypadku, gdy użytkownik przejdzie z miejsca docelowego C z powrotem do miejsca docelowego A, NavController również wyświetli się do miejsca docelowego A. Oznacza to, że usuwa ona B i C ze stosu. inclusive = true uruchamia też pierwsze A, skutecznie czyszcząc stos.

Utwórz implementację

Oto implementacja rozwiązania dla okrągłego popUpTo() w oknie tworzenia wiadomości:

// When creating your `NavGraph` in your `NavHost`.
composable("c") {
    DestinationC(
        onNavigateToA = {
          navController.navigate("a") {
            popUpTo("a") {
              inclusive = true
            }
          }
        },
    )
}

Implementacja widoków danych

Poniżej znajduje się implementacja rozwiązania dla okrągłego popUpTo w 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>