Navigazione circolare

Un chiaro esempio di dove bisogna tornare a una destinazione è quando la navigazione è circolare. Questo documento illustra questo caso d'uso.

Scenario

Immagina che la tua app abbia tre destinazioni: A, B e C. Contiene anche azioni da A a B, poi da B a C e poi da C ad A. Il grafico di navigazione corrispondente ha il seguente aspetto:

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 al back stack. Di conseguenza, navigare ripetutamente nel flusso nel diagramma perché lo stack posteriore contenga più insiemi di ciascuna destinazione: A, B, C, A, B, C, A, B, C.

Soluzione

Per evitare ripetizioni nella pila posteriore, specifica popUpTo() e inclusive nella tua chiamata a NavController.navigate() o nel tuo azione di navigazione.

Considera un caso in cui, dopo aver raggiunto la destinazione C, il back stack ne contiene uno di ogni destinazione: A, B, C. Assicurarsi di aver definito popUpTo() e inclusive nell'azione o nell'invito a navigate() che adottano dell'utente dalla destinazione C alla destinazione A.

In questo caso, quando l'utente va dalla destinazione C alla destinazione A, NavController compare anche nella A. Ciò significa che rimuove B e C dalla lo stack. Con inclusive = true, fa risaltare anche la prima A, di fatto stanno svuotando l'elenco filtri.

Crea 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 viste

Di seguito è riportata l'implementazione della soluzione per la circolare popUpTo in Visualizzazioni:

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