Navigation und Back Stack

NavController enthält einen „Back Stack“ die die Ziele enthält, besucht hat. Wenn Nutzende in Ihrer App zu Bildschirmen navigieren, NavController fügt dem Back Stack Ziele hinzu bzw. entfernt sie daraus.

Ein Stack ist ein „Last In, First Out“- Datenstruktur. Die NavController verschiebt Elemente daher an Elemente und platziert sie oben im Stacks.

Grundlegendes Verhalten

Dies sind die wichtigsten Fakten über das Verhalten des Rückens Stapel:

  • Erstes Ziel:Wenn der Nutzer die App öffnet, wird über die NavController schiebt das erste Ziel an die Spitze des Back-Stacks.
  • An den Stapel senden:Bei jedem Aufruf von NavController.navigate() wird eine Ziel an die Spitze des Stacks rücken.
  • Top-Ziel verschieben:Wenn Sie auf Nach oben oder Zurück tippen, wird die NavController.navigateUp() und NavController.popBackStack() . Sie heben das oberste Ziel ab. Weitere Informationen finden Sie in der Grundsätze der Navigation finden Sie weitere Informationen zu den Unterschieden. zwischen Aufwärts und Zurück.

Pop-Back

Mit der Methode NavController.popBackStack() wird versucht, die aktuelle und navigieren Sie zum vorherigen Ziel. Dieses Nutzende effektiv einen Schritt in ihrem Navigationsverlauf zurückführen. Sie gibt zurück einen booleschen Wert, der angibt, ob es erfolgreich in das Ziel zurückgekehrt ist.

Zu einem bestimmten Ziel zurückkehren

Sie können auch popBackStack() verwenden, um zu einem bestimmten Ziel zu navigieren. Aufgabe Nutzen Sie eine der Überlastungen. Es gibt mehrere Möglichkeiten, Kennung, z. B. eine Ganzzahl id oder ein String route. Diese Überlastung den Nutzer zu dem Ziel führt, das der entsprechenden ID zugeordnet ist. Das Wichtigste ist: wird alles auf dem Stack oberhalb dieses Ziels platziert.

Diese Überlastungen verwenden auch den booleschen inclusive-Wert. Es bestimmt, ob die NavController sollte das angegebene Ziel auch aus dem Back-Stack entfernen nachdem er sie aufgerufen hatte.

Sehen Sie sich als Beispiel dieses kurze Snippet an:

navController.popBackStack(R.id.destinationId, true)

Hier wird NavController zum Ziel mit der ganzzahligen ID zurückgegeben. destinationId. Da der Wert des Arguments inclusive true ist, NavController entfernt auch das angegebene Ziel aus dem Back-Stack.

Umgang mit einem fehlgeschlagenen Pop-Back

Wenn popBackStack() false zurückgibt, wird ein nachfolgender Aufruf von NavController.getCurrentDestination() gibt null zurück. Das bedeutet, dass die App das letzte Ziel aus dem Back Stack gezogen hat. In diesem Fall sieht der Nutzer nur ein leerer Bildschirm.

Dies kann in folgenden Fällen vorkommen:

  • popBackStack() hat nichts aus dem Stapel entfernt.
  • popBackStack() hat ein Ziel aus dem Back Stack entfernt und der Stack ist sind jetzt leer.

Sie müssen dann ein neues Ziel aufrufen oder finish() aufrufen, um das Problem zu beheben auf Ihre Aktivität, um sie zu beenden. Das folgende Snippet veranschaulicht dies:

Königin

...

if (!navController.popBackStack()) {
    // Call finish() on your Activity
    finish()
}

Java

...

if (!navController.popBackStack()) {
    // Call finish() on your Activity
    finish();
}

Pop-up bis zu einem Ziel anzeigen

So entfernen Sie Ziele aus dem Back Stack, wenn Sie von einem Ziel aus navigieren ein popUpTo()-Argument zur verknüpften navigate()-Funktion hinzufügen. aufrufen. popUpTo() weist die Navigationsbibliothek an, einige Ziele zu entfernen aus dem Back-Stack im Rahmen des navigate()-Aufrufs. Der Parameterwert ist Die ID eines Ziels im Back-Stack. Die Kennung kann ein Ganzzahl id oder String route.

Sie können für den Parameter inclusive ein Argument mit dem Wert true angeben. um anzugeben, dass das in popUpTo() angegebene Ziel auch und Pop-off-Back-Stacks.

Um dies programmatisch zu implementieren, übergeben Sie popUpTo() an navigate() als Teil von NavOptions mit inclusive auf true gesetzt. Dies funktioniert sowohl im Schreiben- als auch im Ansichten

Status beim Öffnen speichern

Wenn Sie mit popUpTo zu einem Ziel navigieren, können Sie optional die und die Status aller Ziele lösten sich vom Back Stack ab. Sie können Stellen Sie dann den Back-Stack und die Ziele wieder her, wenn Sie zu diesem Ziel navigieren. später ansehen. So können Sie den Status für ein bestimmtes Ziel beibehalten und mehrere Back Stacks.

Um dies programmatisch zu tun, geben Sie saveState = true an, wenn Sie popUpTo hinzufügen zu die Navigationsoptionen anpassen.

Sie können auch restoreState = true in Ihren Navigationsoptionen angeben, um der Back-Stack und den mit dem Ziel.

Beispiel:

navController.navigate(
    route = route,
    navOptions =  navOptions {
        popUpTo<A>{ saveState = true }
        restoreState = true
    }
)

Wenn du das Speichern und Wiederherstellen des Status in XML aktivieren möchtest, definiere popUpToSaveState als true und restoreState als true in der zugehörigen action.

Beispiel für XML

Hier ist ein Beispiel für popUpTo in XML mit einer Aktion:

<action
  android:id="@+id/action_a_to_b"
  app:destination="@id/b"
  app:popUpTo="@+id/a"
  app:popUpToInclusive="true"
  app:restoreState=”true”
  app:popUpToSaveState="true"/>

Beispiel für „Compose“

Im Folgenden finden Sie ein vollständiges Beispiel dafür in Compose:

@Composable
fun MyAppNavHost(
    modifier: Modifier = Modifier,
    navController: NavHostController = rememberNavController(),
    startDestination: Any = A
) {
    NavHost(
        modifier = modifier,
        navController = navController,
        startDestination = startDestination
    ) {
        composable<A> {
            DestinationA(
                onNavigateToB = {
                // Pop everything up to, and including, the A destination off
                // the back stack, saving the back stack and the state of its
                // destinations.
                // Then restore any previous back stack state associated with
                // the B destination.
                // Finally navigate to the B destination.
                    navController.navigate(route = B) {
                        popUpTo<A> {
                            inclusive = true
                            saveState = true
                        }
                        restoreState = true
                    }
                },
            )
        }
        composable<B> { DestinationB(/* ... */) }
    }
}

@Composable
fun DestinationA(onNavigateToB: () -> Unit) {
    Button(onClick = onNavigateToB) {
        Text("Go to A")
    }
}

Im Detail können Sie ändern, wie Sie NavController.navigate() anrufen. auf folgende Arten:

// Pop everything up to the destination_a destination off the back stack before
// navigating to the "destination_b" destination
navController.navigate("destination_b") {
    popUpTo("destination_a")
}

// Pop everything up to and including the "destination_a" destination off
// the back stack before navigating to the "destination_b" destination
navController.navigate("destination_b") {
    popUpTo("destination_a") { inclusive = true }
}

// Navigate to the "search” destination only if we’re not already on
// the "search" destination, avoiding multiple copies on the top of the
// back stack
navController.navigate("search") {
    launchSingleTop = true
}

Allgemeine Informationen zur Übergabe von Optionen an NavController.navigate() finden Sie unter Leitfaden „Mit Optionen navigieren“

Mit Aktionen platzen

Wenn du mit einer Aktion navigierst, kannst du optional zusätzliche Ziele hinzufügen aus dem Back Stack entfernt. Bei einem anfänglichen Anmeldevorgang für Ihre App wenn sich ein Nutzer angemeldet hat, sollten Sie alle Anmeldeziele um zu verhindern, dass Nutzer über die Schaltfläche „Zurück“ zur Anmeldung zurückgeleitet werden. Ablauf.

Weitere Informationen

Weitere Informationen finden Sie auf den folgenden Seiten:

  • Kreisförmige Navigation: Überladene Seitennavigation vermeiden in Fällen, in denen Navigationsflüsse kreisförmig sind.
  • Dialogziele: Informationen zur Einführung von Dialogzielen besondere Überlegungen zur Verwaltung Ihres Back-Stacks.