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.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para pasar un argumento desde NavHostController al método init{} del ViewModel, sigue estos pasos:

    1. En tu archivo NavGraph XML, agrega un argumento a la etiqueta fragment que corresponda al fragmento de destino al que deseas pasar el argumento.
    <fragment android:id="@+id/my_destination_fragment" android:name="com.example.MyDestinationFragment" android:label="My Destination Fragment">
        <argument android:name="myArgument" app:argtype="string"></argument>
    </fragment>
    
    1. En tu Fragment, obtén el argumento utilizando la función NavArgs proporcionada por Android Jetpack Navigation.
    class MyDestinationFragment : Fragment() {
    
        private val args: MyDestinationFragmentArgs by navArgs()
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            val myArgument = args.myArgument // obtener el valor del argumento
        }
    }
    
    1. En tu ViewModel, crea un constructor que tome el tipo y el valor del argumento como parámetros.
    class MyViewModel(private val myArgument: String) : ViewModel() {
    
        init {
            // utilizar el valor de myArgument aquí
        }
    }
    
    1. En tu Fragment, obtén el NavHostController y crea una instancia de tu ViewModel, pasando el valor del argumento.
    class MyDestinationFragment : Fragment() {
    
        private val args: MyDestinationFragmentArgs by navArgs()
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            val myArgument = args.myArgument
    
            val navController = findNavController()
            val viewModel = ViewModelProvider(
                navController.getViewModelStoreOwner(myViewModelScope),
                MyViewModelFactory(myArgument)
            ).get(MyViewModel::class.java)
        }
    }
    

    Ten en cuenta que en el paso 4, estamos utilizando una ViewModelFactory personalizada para crear nuestra instancia de ViewModel y pasar el valor del argumento. Esta ViewModelFactory debe tomar el tipo y el valor del argumento como parámetros y proporcionarlos al constructor del ViewModel.

Comments are closed.