Saltar al contenido

Cómo obtener contexto en Android MVVM ViewModel

Sebastián, miembro de nuestro equipo, nos hizo el favor de escribir este enunciado ya que controla a la perfección dicho tema.

Solución:

Puedes usar un Application contexto proporcionado por el AndroidViewModeldebes extender AndroidViewModel que es simplemente un ViewModel que incluye un Application referencia.

Para el modelo de vista de componentes de arquitectura de Android,

No es una buena práctica pasar su contexto de actividad al modelo de vista de la actividad ya que es una pérdida de memoria.

Por lo tanto, para obtener el contexto en su ViewModel, la clase ViewModel debería extender el Modelo de vista de Android Clase. De esa manera, puede obtener el contexto como se muestra en el código de ejemplo a continuación.

class ActivityViewModel(application: Application) : AndroidViewModel(application) 

    private val context = getApplication().applicationContext

    //... ViewModel methods 


No es que ViewModels no deba contener código específico de Android para facilitar las pruebas, ya que es la abstracción lo que facilita las pruebas.

La razón por la que ViewModels no debe contener una instancia de Contexto ni nada parecido a Vistas u otros objetos que se aferren a un Contexto es porque tiene un ciclo de vida separado de Actividades y Fragmentos.

Lo que quiero decir con esto es, digamos que haces un cambio de rotación en tu aplicación. Esto hace que su Actividad y Fragmento se destruyan a sí mismos para que se recreen. ViewModel está destinado a persistir durante este estado, por lo que existe la posibilidad de que se produzcan bloqueos y otras excepciones si todavía tiene una vista o un contexto para la actividad destruida.

En cuanto a cómo debe hacer lo que quiere hacer, MVVM y ViewModel funcionan muy bien con el componente de enlace de datos de JetPack. Para la mayoría de las cosas para las que normalmente almacenaría una cadena, un int, etc., puede usar el enlace de datos para hacer que las vistas lo muestren directamente, por lo que no es necesario almacenar el valor dentro de ViewModel.

Pero si no desea el enlace de datos, aún puede pasar el Contexto dentro del constructor o los métodos para acceder a los Recursos. Simplemente no mantenga una instancia de ese Contexto dentro de su ViewModel.

Tienes la opción de añadir valor a nuestro contenido participando con tu veteranía en las críticas.

¡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 *