Compose-Navigation: Entfernen Sie das vorherige Composable vom Stapel, bevor Sie navigieren

Lesezeit: 3 Minuten

Ich benutze compose-navigation(alpha09), um die Navigation zwischen Composables zu verwalten

Ich möchte das entfernen Begrüßungsbildschirm beim Umzug zum nächsten Ziel (ich möchte das nicht zurück gedrückt um zurück zu Splash zu kommen)

Folgende Versuche haben nicht wie erwartet funktioniert:

navHostController.navigate(Route.login.id) {
    navHostController.graph.clear()
}
navHostController.navigate(Route.login.id)
navHostController.graph.clear()
val currentDest = navHostController.currentDestination
navHostController.navigate(Route.login.id)
if (currentDest != null) {
   navHostController.graph.remove(currentDest)
}

Wie kann ich also den Begrüßungsbildschirm entfernen und dann mit dem nächsten Schritt fortfahren?

Benutzeravatar von iknow
Ich weiss

In Jetpack Compose 1.0.0 Um zu navigieren und das vorherige Composable aus dem hinteren Stapel zu entfernen, können Sie Folgendes verwenden:

navController.navigate(Screens.Login.name) {
    popUpTo(Screens.Splash.name) {
        inclusive = true
    }
}

Der obige Code navigiert von dort aus Splash Bildschirm zu Login und es wird alles angezeigt, einschließlich der Splash Bildschirm.

Navigieren Sie zu einem zusammensetzbaren Dokument

  • Cool. Dank. Ich werde Ihre akzeptieren, da meine alte Selbstantwort jetzt veraltet ist.

    – Mahdi-Malv

    10. Juli 2021 um 12:40 Uhr

  • Großartig, es hat funktioniert, popUpTo(0) hat bei mir nicht funktioniert

    – Mubashir Murtaza

    26. Dezember 2022 um 5:17 Uhr

Benutzeravatar von Mahdi-Malv
Mahdi-Malv

Für v1.0.0-alpha09 (Und 1.0 stabil)

Benutzen popUpTo(0) Sie können den Stapel leeren, bevor Sie zum nächsten Ziel navigieren. So:

navHostController.navigate(Route.login.id) {
    // popUpTo = 0 // DEPRECATED
    popUpTo(0)
}

  • popUpto ist veraltet

    – Rulogarcillan

    20. Juni 2021 um 21:59 Uhr

  • @Rulogarcillan Aber nicht popUpTo(0)

    – vitidev

    10. August 2021 um 13:25 Uhr

  • Gültige Lösung für 1.0.0 stabil

    – Daniele

    27. April 2022 um 10:15 Uhr

  • Das einzige, das bei mir funktioniert hat. Ich bin überrascht, dass dies nirgendwo in den Dokumenten erwähnt wird

    – Driss Bounouar

    25. August 2022 um 13:24 Uhr

  • Die Lösung, die ich gefunden habe, ist die Vermeidung der Hartcodierung von 0. Sie können das erste Element von navHostController.backQueue verwenden und seine ID an popUpTo übergeben: popUpTo(navHostController.backQueue.first().destination.id) Weitere Informationen finden Sie hier im Detail Erläuterung medium.com/@banmarkovic/…

    – Ban Markovic

    3. Januar um 12:59


Benutzeravatar von bboyairwreck
bboyairwreck

Für eine konsistente wiederverwendbare Funktion, die die aktuelle Route nicht kennen muss, verwenden Sie diese NavOptionsBuilder-Erweiterungsfunktion

fun NavOptionsBuilder.popUpToTop(navController: NavController) {
    popUpTo(navController.currentBackStackEntry?.destination?.route ?: return) { 
        inclusive =  true
    }
}

^ Ähnlich wie bei anderen Antworten wird popUpTo zur aktuellen Route angezeigt, aber anstatt die spezifische aktuelle Route zu benennen, wird sie stattdessen aus dem Backstack-Eintrag abgerufen.

Jetzt können Sie es wie folgt verwenden:

navController.navigate(ScreenRoutes.Login.route) { popUpToTop(navController) }

^ Dieses Beispiel navigiert zu „Anmelden“ und sollte den gesamten Backstack davor leeren.

Benutzer-Avatar von Abdul Mateen
Abdul Mateen

Zum Abräumen des gesamten Backstacks

Um mehrere zusammensetzbare Bildschirme aus dem Stapel zu entfernen, verwenden Sie das folgende Snippet

navController.navigate(ScreenRoutes.Login.route){
                    popUpTo(navController.graph.findStartDestination().id){
                        inclusive = true  }}

Oder um Home im hinteren Stapel zu halten

navController.navigate(ScreenRoutes.SelectCourseLayout.route){
    popUpTo(ScreenRoutes.Home.route)
}

Ban Markovics Benutzeravatar
Ban Markovic

Abgesehen von Bildschirmen enthält der Backstack Navigationsdiagramme, und sein Stamm ist immer das Erste im Backstack. Unser NavHostController enthält ein Diagramm, sodass Sie durch Einfügen seiner ID Ihren Backstack löschen können:

popUpTo(navHostController.graph.id)

Weitere Informationen finden Sie hier in der ausführlichen Erklärung https://medium.com/@banmarkovic/jetpack-compose-clear-back-stack-popbackstack-inclusive-explained-14ee73a29df5

Benutzeravatar von Jaydipsinh Zala
Jaydipsinh Zala

Um den Backstack zu löschen, können Sie diesen einfach erstellen Extension Funktion und verwenden Sie es gegebenenfalls wieder.

fun NavHostController.navigateAndClean(route: String) {
    navigate(route = route) {
        popUpTo(graph.startDestinationId) { inclusive = true }
    }
    graph.setStartDestination(route)
}

Huns Benutzeravatar
Hunne

Jetpack Compose v1.0.5

navController.backQueue.removeIf { it.destination.route == "Splash" }
navController.popBackStack()

1453280cookie-checkCompose-Navigation: Entfernen Sie das vorherige Composable vom Stapel, bevor Sie navigieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy