Page cover

ViewModel con data classes

En muchas ocasiones, vamos a quere crear ventanas que sirven para rellenar los datos de una determinada entidad y al pulsar un botón se guardará en una base de datos. Para este tipo de ventanas vinculadas a una instancia de una entidad, vamos a usar un objeto de una data class como estado del ViewModel.

Cuando queramos modificar algún campo de dicho objeto utilizaremos el método copy de las data classes para modificar solo ese campo.

Ejemplo

Por ejemplo, podemos crear una aplicación para gestionar tareas (Task). Esta aplicación tendrá una ventana CreateTaskScreen (sirve para crear una nueva tarea)

Cada tarea la reprsentaremos con la data class Task

com.example.myApp.domain.model.Task.kt
data class Task(val id: Int, val title: String, val description: String)

CreateTaskScreen

Primer creamos el ViewModel que gestiona los datos de una tarea

import androidx.lifecycle.ViewModel
import com.example.tasksapp.domain.model.Task
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow

class CreateTaskViewModel : ViewModel() {
    // Estado mutable que almacena el listado de tareas
    private val _task = MutableStateFlow<Task>(
        Task(0, "", "")
    )
    // Version inmutable del estado anterior, es el estado que va a leer el UI
    val task: StateFlow<Task> = _task
    
    
    fun setTitle(title: String) {
        _task.value = _task.value.copy(title = title)
    }
    
    fun setDescription(description: String) {
        _task.value = _task.value.copy(description = description)
    }
    
    
    fun save() {
        // TODO Aquí va la lógica para guardar la tarea
        // Veremos qué se hace en el próximo tema
    }
}

Ahora ya podemos usarlo en la ventana CreateTaskScreen

Última actualización

¿Te fue útil?