Junior
Cuéntame sobre Jetpack ViewModel.
sobes.tech AI
Respuesta de la IA
ViewModel almacena y gestiona datos relacionados con la interfaz de usuario teniendo en cuenta el ciclo de vida. Sobrevive a cambios de configuración (como rotaciones de pantalla, cambios de diseño), evitando la pérdida de datos.
Características clave:
- Guardar datos: ViewModel no se destruye durante cambios de configuración, manteniendo el estado de la UI.
- Separación de lógica y UI: La lógica de negocio se coloca en el ViewModel, lo que facilita las pruebas y el mantenimiento de Activity/Fragment.
- Integración con LiveData: Frecuentemente se usa con LiveData para observar cambios en los datos.
Ejemplo de uso:
// MyViewModel.kt
import androidx.lifecycle.ViewModel
class MyViewModel : ViewModel() {
// Datos que deben mantenerse durante cambios de configuración
var counter = 0
}
// MyActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.lifecycle.ViewModelProvider
class MyActivity : AppCompatActivity() {
private lateinit var viewModel: MyViewModel
private lateinit var counterText: TextView
private lateinit var incrementButton: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Obtención del ViewModel
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
counterText = findViewById(R.id.counter_text)
incrementButton = findViewById(R.id.increment_button)
// Mostrar datos del ViewModel
updateCounterDisplay()
incrementButton.setOnClickListener {
viewModel.counter++
updateCounterDisplay()
}
}
private fun updateCounterDisplay() {
counterText.text = viewModel.counter.toString()
}
}
Duración de vida: ViewModel vive mientras el Scope asociado (por ejemplo, Activity) esté vivo. Cuando el Scope termina, el ViewModel se destruye.
ViewModelProviders (ahora ViewModelProvider) se usaba para obtener una instancia de ViewModel antes de Kotlin. En Kotlin, se recomienda usar ViewModelProvider(this).get(MyViewModel::class.java).
Ventajas principales del ViewModel sobre clases normales para almacenar el estado de la UI:
- Sobrevive a cambios de configuración.
- Es gestionado por el framework del ciclo de vida de Jetpack.
Desventajas:
- Puede volverse demasiado grande con lógica de UI compleja.
- No debe contener referencias a View, Context u otros objetos con ciclo de vida, para evitar fugas de memoria.