Sobes.tech
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.