Navigazione circolare

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
Figura 1. Un grafico di navigazione circolare con tre destinazioni: A, B e C.

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>