Saltar al contenido

Componente de arquitectura de navegación de Android: cómo pasar datos de paquetes a startDestination

Este grupo de expertos luego de ciertos días de investigación y de juntar de datos, dimos con los datos necesarios, deseamos que te resulte útil para tu proyecto.

Solución:

Respondiendo a mi propia pregunta, ya que encontré el enfoque correcto en la documentación de navegación actualizada.

En el momento de escribir esta respuesta, estoy usando Navigation 2.2.0-alpha01

Si desea pasar algunos datos al destino de inicio directamente como argumentos de la actividad del host, debe configurar manualmente el gráfico de navegación de su host dentro del método onCreate () de la actividad del host, como se muestra a continuación:

Consiga su navController:

val navController by lazy  findNavController(R.id.) 

Luego, en la actividad del anfitrión onCreate()

val bundle = Bundle()
bundle.putString("some_argument", "some_value")
navController.setGraph(R.navigation., bundle)

O si desea pasar todos los extras de la intención tal como está al inicioDestination:

navController.setGraph(R.navigation., intent.extras)

Ya que intent.extras devolvería un Bundle solamente

Cuando configura navGraph usando el método setGraph (), debe evitar configurar la aplicación: NavGraph attribute en la definición de NavHostFragment, porque hacerlo da como resultado inflar y configurar el gráfico de navegación dos veces.

Mientras lee estos argumentos en su fragmento startDestination:

Si está utilizando el complemento Safe Args (que es muy recomendable), en su fragmento:

private val args by navArgs()

El complemento Safe Args generaría una clase Args agregando Args al nombre de su fragmento. Por ejemplo, si tu fragmento se llama DummyFragment entonces Safe Args generaría una clase llamada DummyFragmentArgs

dónde navArgs<> es una función de extensión definida en Android KTX

Si no está utilizando Android KTX, puede obtener el objeto args como:

val args = DummyFragmentArgs.fromBundle(arguments!!)

Una vez que haya adquirido el objeto de argumentos, simplemente puede buscar sus argumentos:

args.someArgument

Fíjate como pasamos "some_argument" como argumento, y lo estamos leyendo como someArgument usando Safe Args

Si no está usando Safe Args (aunque no hay razón para no usarlo), puede acceder a sus argumentos de esta manera:

arguments?.getString("some_argument")

Todo esto está documentado en la documentación del componente Migrate to Navigation aquí: https://developer.android.com/guide/navigation/navigation-migrate#pass_activity_destination_args_to_a_start_destination_fragment

también me encontré con el mismo problema,

Así es como lo resolví:

  1. Eliminar la configuración xml de NavHostFragment desde your_activity.xml : es decir, eliminar aplicación: navGraph = “@ navigation / nav_graph

Así es como debería verse su XML.

        
  1. Agregar Configuración de NavHostFragment de forma programada en onCreate() de actividad. Y pasar datos de paquetes usando NavGraph.addDefaultArguments(bundleData)api

        override fun onCreate(savedInstanceState: Bundle?) 
            super.onCreate(savedInstanceState)
            setContentView(R.layout.editor_layout)
            setupNavigation()
        
    
        private fun setupNavigation() 
            val navHostFragment = nav_host as NavHostFragment
            val navController = navHostFragment.navController
            val navInflater = navController.navInflater
            val graph = navInflater.inflate(R.navigation.nav_graph)
            graph.addDefaultArguments(intent!!.extras!!) // This is where you pass the bundle data from Activity to StartDestination 
            navHostFragment.navController.graph = graph
        
    

ACTUALIZAR:

Dependencias en mi archivo Project Gradle:

dependencies 

    def nav_version = "1.0.0-alpha08"

    implementation "android.arch.navigation:navigation-fragment:$nav_version" // use -ktx for Kotlin
    implementation "android.arch.navigation:navigation-ui:$nav_version" // use -ktx for Kotlin
}

NOTA: En la versión del componente de navegación 1.0.0-alpha09 por alguna razón, Google no tiene un método como addDefaultArguments() podría arreglarse pronto. Pero las versiones inferiores tienen addDefaultArguments() método He comprobado tanto en java como en kotlin, así que intente usar 1.0.0-alpha07 o 1.0.0-alpha08

Encontré la solución después de investigar un poco. Funciona con la última versión de la biblioteca de navegación. Consulte el siguiente código:

  1. Agregue esto en el diseño de su actividad. Nota: no estamos configurando aplicación: navGraph argumento en el archivo xml. Lo configuraremos dinámicamente.

    
    
  2. En su archivo java de actividad, escriba el siguiente código y realice los cambios correspondientes. Usar NavArgument para pasar el valor de su argumento y agregar el argumento a su gráfico de navegación personalizado y luego configurar el gráfico.

    public class YourActivity extends AppCompatActivity 
         private NavArgument nameArg, mailArg;
    
         @Override
         protected void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.profile);
            nameArg = new NavArgument.Builder().setDefaultValue("your name").build();
            mailArg = new NavArgument.Builder().setDefaultValue("your email id").build();
            NavController navController = Navigation.findNavController(this, R.id.fragment);
            NavInflater navInflater = navController.getNavInflater();
            NavGraph navGraph = navInflater.inflate(R.navigation.nav_profile_graph);
            navGraph.addArgument("your name key", nameArg);
            navGraph.addArgument("your mail key", mailArg);
            navController.setGraph(navGraph);
        
    
    
  3. Escriba el gráfico de navegación a continuación y agregue el mismo argumento keys al fragmento inicial.

    
    
    
       
    
          
    
          
    
       
    
    
  4. En su fragmento, simplemente obtenga los valores usando la función getArguments ().

    String name = getArguments().getString("your name key");
    String mail = getArguments().getString("your mail key");
    

Te mostramos reseñas y calificaciones

No se te olvide dar difusión a este enunciado si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *