es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pase un argumento a un gráfico de navegación anidado en Jetpack Compose.

Desde la documentación, veo que se pueden anidar gráficos de navegación de la siguiente manera:

NavHost(navController, startDestination = "home") {
    ...
    // Al navegar al gráfico a través de su ruta ('login') automáticamente
    // se navega al destino de inicio del gráfico- 'nombre de usuario'
    // encapsulando así la lógica de enrutamiento interna del gráfico
    navigation(startDestination = "username", route = "login") {
        composable("username") { ... }
        composable("password") { ... }
        composable("registration") { ... }
    }
    ...
}

Me pregunto, ¿cómo se pasa un argumento en la ruta y se hace disponible para todos los componibles dentro del gráfico de navegación?

Aquí está mi gráfico de navegación actual:

navigation(
    // Me gustaría obtener este parámetro
    route = "dashboard?classId={classId}",
    startDestination = Route.ScreenOne.route) {
    composable(Route.ScreenOne.route) {
        // Y luego pasar el parámetro aquí, o a cualquier componible inferior
        ScreenOne(classId)
    }
    composable(Route.ScreenTwo.route) {
        ScreenTwo()
    }
    composable(Route.ScreenThree.route) {
        ScreenThree()
    }
}

Básicamente, estoy tratando de evitar establecer el argumento de navegación classId individualmente en cada ruta componible. No vi una manera de pasar una lista de argumentos a navegación() como se puede en un componible().

Puede ser que lo que estoy describiendo no sea posible, ¡pero espero los pensamientos de cualquiera!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para pasar un argumento en la ruta y hacerlo disponible para todos los componentes dentro del gráfico de navegación, puedes usar argumentos nombrados en la cadena de la ruta y recuperarlos usando la propiedad navBackStackEntry?.arguments dentro de cada componente. Aquí tienes un ejemplo:

    // Definir una ruta con un argumento nombrado
    ruta = "dashboard?classId={classId}"
    
    // Dentro de cada componente, recuperar el argumento
    val navBackStackEntry by navController.currentBackStackEntryAsState()
    val classId = navBackStackEntry?.arguments?.getString("classId")
    
    // Usar el argumento en el componente
    ScreenOne(classId)
    

    Con este enfoque, puedes pasar el argumento classId solo una vez en la llamada a navigation() y recuperarlo en cada componente usando la propiedad navBackStackEntry?.arguments. Ten en cuenta que esta propiedad devuelve un Bundle?, por lo que debes usar el método adecuado para recuperar el argumento basado en su tipo (por ejemplo, getString () para un argumento de tipo String).

Comments are closed.