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:
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>