Sobes.tech
Junior

Habla sobre Jetpack ViewModel.

sobes.tech AI

Respuesta de la IA

ViewModel es un componente de Jetpack diseñado para almacenar y gestionar datos de manera vinculada a la interfaz de usuario. Su objetivo principal es mantener los datos de la UI durante cambios de configuración, como la rotación de pantalla, y sobrevivir al ciclo de vida de una Activity o Fragment.

Características de ViewModel:

  • Almacenamiento de datos: Sobrevive a cambios de configuración e incluso a la destrucción de la Activity/Fragment, restaurando los datos al ser recreados.
  • Separación de lógica: Separa la lógica de preparación de datos para la UI del propio UI (Activity/Fragment).
  • Vinculación al ciclo de vida: Está asociado con el ciclo de vida de la Activity o Fragment.
  • Prevención de fugas de memoria: No mantiene referencias directas a View, Lifecycle o Activity/Fragment, lo que previene fugas de memoria.

Cómo usar:

  1. Crea una clase que herede de ViewModel.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // Inicialización de datos
        }
    
        fun fetchData() {
            // Lógica para cargar datos
            _data.value = "Datos cargados"
        }
    
        override fun onCleared() {
            // Limpieza de recursos
            super.onCleared()
        }
    }
    
  2. Obtén una instancia de ViewModel en una Activity o Fragment.

    class MyActivity : AppCompatActivity() {
        private lateinit var viewModel: MyViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
    
            viewModel.data.observe(this, Observer { newData ->
                // Actualización de la UI
            })
    
            viewModel.fetchData()
        }
    }
    
  3. Usa ViewModelProvider.Factory para crear instancias de ViewModel con dependencias.

    class MyViewModel(private val repository: MyRepository) : ViewModel() {
        // ...
    }
    
    class MyViewModelFactory(private val repository: MyRepository) : ViewModelProvider.Factory {
        override fun <T : ViewModel> create(modelClass: Class<T>): T {
            if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
                @Suppress("UNCHECKED_CAST")
                return MyViewModel(repository) as T
            }
            throw IllegalArgumentException("Unknown ViewModel class")
        }
    }
    
    // En la Activity/Fragment
    // val repository = MyRepository() // Inyección de dependencia
    // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
    

Comparación con onSaveInstanceState():

Característica ViewModel onSaveInstanceState()
Sobrevivir a cambios de configuración Sí (para datos pequeños)
Sobrevivir a proceso No (los datos se pierden tras destruir el proceso) Sí (para datos pequeños)
Almacenamiento de datos Objetos, LiveData Bundle (primitivos, Serializable, Parcelable)
Fugas de memoria No (si se usa correctamente) Posible si se mantienen referencias a Activity/View
Complejidad de implementación Más complejo para escenarios simples Más sencillo para escenarios simples

ViewModel ayuda a crear aplicaciones más resistentes y fáciles de probar, separando la UI de la lógica de procesamiento de datos.