Compose-Navigation: elimine el componible anterior de la pila antes de navegar

3 minutos de lectura

Estoy usando compose-navigation(alpha09) para manejar la navegación entre componibles

quiero quitar el Pantalla de bienvenida al pasar al siguiente destino (no quiero que el atrás presionado para volver a Splash)

Los siguientes intentos no funcionaron como se esperaba:

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

Entonces, ¿cómo puedo eliminar la pantalla de bienvenida y luego pasar a la siguiente?

avatar de usuario de iknow
lo sé

En Jetpack Componer 1.0.0 para navegar y eliminar el Composable anterior de la pila trasera Puedes usar:

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

El código anterior navegará desde el Splash pantalla a Login y aparecerá todo, incluido el Splash pantalla.

Navegar a un componible – docs

  • Fresco. Agradecer. Aceptaré la tuya ya que mi antigua respuesta automática está obsoleta ahora.

    – Mahdi Malv

    10 de julio de 2021 a las 12:40

  • Genial, funcionó, popUpTo(0) no funcionó para mí

    –Mubashir Murtaza

    26 de diciembre de 2022 a las 5:17

Avatar de usuario de Mahdi-Malv
Mahdi Malv

Para v1.0.0-alfa09 (Y 1.0 estable)

Usando popUpTo(0) puede borrar la pila antes de navegar al siguiente destino. Entonces:

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

  • popUpto está en desuso

    – Rulogarcilan

    20 de junio de 2021 a las 21:59

  • @Rulogarcillan Pero no popUpTo(0)

    – vitidev

    10 de agosto de 2021 a las 13:25

  • Solución válida para 1.0.0 estable

    – Danielle

    27 de abril de 2022 a las 10:15

  • El único que funcionó para mí, me sorprende que esto no se mencione en ninguna parte de los documentos

    – Driss Bounouar

    25 de agosto de 2022 a las 13:24

  • La solución que encontré es evitar la codificación 0, puede usar el primer elemento de navHostController.backQueue y pasar su id a popUpTo: popUpTo(navHostController.backQueue.first().destination.id) Para obtener más información, aquí está el detalle explicación medium.com/@banmarkovic/…

    –Ban Markovic

    3 ene a las 12:59


avatar de usuario de bboyairwreck
naufragio bboyair

Para una función reutilizable consistente que no necesita conocer la ruta actual, use esta función de extensión NavOptionsBuilder

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

^ Al igual que otras respuestas, aparece en la ruta actual, pero en lugar de tener que nombrar la ruta actual específica, la obtiene de la entrada de backstack.

Ahora puedes usarlo así:

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

^ Ese ejemplo navega a Iniciar sesión y debería borrar toda la pila anterior.

Avatar de usuario de Abdul Mateen
Abdul Mateen

Para borrar toda la pila trasera

Para eliminar varias pantallas componibles de la pila, use el siguiente fragmento

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

O para mantener a Home en back stack

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

Avatar de usuario de Ban Markovic
Prohibir Markovic

Aparte de las pantallas, la pila trasera contiene gráficos de navegación, y su raíz es siempre lo primero en la pila trasera. Nuestro NavHostController contiene un gráfico, por lo que al abrir su id, puede borrar su back stack:

popUpTo(navHostController.graph.id)

Para más información, aquí está la explicación detallada. https://medium.com/@banmarkovic/jetpack-compose-clear-back-stack-popbackstack-inclusive-explained-14ee73a29df5

Avatar de usuario de Jaydipsinh Zala
jaydipsinh zala

Para borrar la pila posterior, simplemente puede crear esto Extension funcione y reutilícelo cuando corresponda.

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

Avatar de usuario de Hun
huno

Jetpack componer v1.0.5

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

¿Ha sido útil esta solución?