Un chiaro esempio di dove tornare a una destinazione è quando la navigazione è circolare. Questo documento descrive il caso d'uso.
Scenario
Immagina che la tua app abbia tre destinazioni: A, B e C. Presenta anche azioni che portano da A a B, da B a C e da C ad A. Il grafico di navigazione corrispondente viene visualizzato come segue:
![una dimostrazione della navigazione circolare](https://developer.android.com/static/images/topic/libraries/architecture/navigation-getting-started-pop.png?authuser=6&hl=it)
A ogni azione di navigazione, NavController
aggiunge la nuova destinazione allo stack posteriore. Di conseguenza, esplorando ripetutamente il flusso nel diagramma,
lo back stack dovrebbe contenere più insiemi per ogni destinazione: A, B,
C, A, B, C, A, B, C.
Soluzione
Per evitare ripetizioni nello stack precedente, specifica popUpTo()
e
inclusive
nella chiamata a NavController.navigate()
o nell'azione di navigazione.
Considera un caso in cui, dopo aver raggiunto la destinazione C, lo stack di back contiene un'istanza di ogni destinazione: A, B, C. Devi assicurarti di aver definito popUpTo()
e inclusive
nell'azione o nell'invito a navigate()
che porta l'utente dalla destinazione C alla destinazione A.
In questo caso, quando l'utente passa dalla destinazione C alla destinazione A,
anche NavController
appare in A. Ciò significa che B e C vengono rimossi
dallo stack. Con inclusive = true
, fa anche scattare la prima A, cancellando
efficacemente lo stack.
Scrivi implementazione
Di seguito è riportata l'implementazione della soluzione per la circolare popUpTo()
in Scrivi:
// When creating your `NavGraph` in your `NavHost`.
composable("c") {
DestinationC(
onNavigateToA = {
navController.navigate("a") {
popUpTo("a") {
inclusive = true
}
}
},
)
}
Implementazione delle visualizzazioni
Di seguito è riportata l'implementazione della soluzione per la circolare popUpTo
in
View:
<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>