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.
davy.ai
Solución
Para pasar un objeto de clase entre fragmentos en un
ViewModel
compartido, debes inicializar elViewModel
utilizando el contexto de laActivity
en lugar del contexto delFragmento
.En tu implementación actual, estás pasando
this
(que representa el contexto delFragmento
) como el primer parámetro del constructor deViewModelProvider
. En su lugar, debes pasar el contexto de laActivity
llamando arequireActivity()
dentro del fragmento.Así es como puedes modificar tu función
initializeViewModel()
para obtener el contexto de laActivity
:Con esta modificación, deberías poder compartir datos entre fragmentos utilizando tu
sharedViewModel
.