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.

compartir datos entre fragmentos utilizando ModelFactory

He implementado con éxito MVVM basado en repositorios. Sin embargo, necesito pasar un objeto de clase entre fragmentos. He implementado un sharedViewModel entre varios fragmentos, pero el valor establecido siempre es nulo. Sé que esto se debe a que no estoy pasando el contexto de la actividad a la inicialización de los viewmodels en los fragmentos. Estoy trabajando con ModelFactory para crear instancias de mis viewmodel, pero no puedo encontrar una forma de pasar ‘applicationActivity()’.

Aquí está mi ModelFactory:

class MyViewModelFactory constructor(private val repository: MyRepository): ViewModelProvider.Factory {

    override fun <t :="" viewmodel=""> create(modelClass: Class<t>): T {
        return if (modelClass.isAssignableFrom(MyOwnViewModel::class.java)) {
            MyOwnViewModel(this.repository) as T
        } else {
            throw IllegalArgumentException("ViewModel Not Found")
        }
    }
}

Y así es como inicializo mi viewmodel:

viewModel = ViewModelProvider(this, MyViewModelFactory(
        MyRepository(MyServices()))).get(MyOwnViewModel::class.java)

La obtención de datos y todo lo demás funciona, pero necesito poder compartir datos entre fragmentos y no puedo hacerlo con esta arquitectura. No estoy usando dagger ni Hilt.
Gracias por cualquier indicación.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Solución

    Para pasar un objeto de clase entre fragmentos en un ViewModel compartido, debes inicializar el ViewModel utilizando el contexto de la Activity en lugar del contexto del Fragmento.

    En tu implementación actual, estás pasando this (que representa el contexto del Fragmento) como el primer parámetro del constructor de ViewModelProvider. En su lugar, debes pasar el contexto de la Activity llamando a requireActivity() dentro del fragmento.

    Así es como puedes modificar tu función initializeViewModel() para obtener el contexto de la Activity:

    private fun initializeViewModel() {
        val activity = requireActivity() // Obtén el contexto de la Activity
        val factory = MyViewModelFactory(MyRepository(MyServices()))
        viewModel = ViewModelProvider(activity, factory).get(MyOwnViewModel::class.java)
    }
    

    Con esta modificación, deberías poder compartir datos entre fragmentos utilizando tu sharedViewModel.

Comments are closed.