Gestión de Acciones y Estados en ViewModel de Android

Clase 10 de 19Curso de Jetpack Compose en Android

Resumen

¿Cómo mejorar la interacción de tu pantalla con ViewModel en Android?

Es fascinante ver cómo una aplicación puede responder a las interacciones del usuario, permitiendo marcar tareas como completadas, eliminarlas, o actualizarlas. Al abordar la programación en Android, el ViewModel es una herramienta clave que facilita organizar y manejar estas acciones interactivas. Aquí te mostramos los pasos esenciales para lograr que tu aplicación responda adecuadamente a estas acciones.

¿Cómo comenzar con las modificaciones iniciales en tu DataSource?

Para habilitar la visibilidad de la información en pantalla, se realizan unas modificaciones en la clase FakeDataLocalDataSource. Agregar un bloque init después del flujo de tareas es fundamental. El objetivo es cargar una primera tanda de información de tareas completadas y pendientes, fusionando listas para que todo esté listo para su visualización en la interfaz de usuario.

init {
    completed = completedTask + pendingTask
}

¿Cómo mejorar la organización con una data class para el estado?

Separar el estado del home en una clase independiente mejora la organización del proyecto. Usar una data class específica como HomeDataState permite mantener todo mucho más ordenado y en su lugar adecuado.

data class HomeDataState(
    val completedTasks: List,
    val pendingTasks: List
)

¿Cuál es el propósito de una Sealed Interface en las acciones de la pantalla?

Una Sealed Interface en Android permite describir claramente las acciones que el usuario puede llevar a cabo. Estas acciones se especifican a través de data classes independientes para cada tipo de acción. Esto permite gestionar diferentes comportamientos como marcar tareas completas o eliminar una tarea específica.

sealed interface HomeScreenAction {
    data class OnToggleTask(val task: Task) : HomeScreenAction
    data class OnDeleteTask(val task: Task) : HomeScreenAction
    object OnDeleteAllTasks : HomeScreenAction
    object OnAddTask : HomeScreenAction
}

¿Cómo gestionar eventos derivados de acciones con una sealed class?

El uso de una sealed class para modelar eventos es fundamental. Estas clases ayudan a mapear eventos específicos que se desencadenan por acciones del usuario, asegurando un tratamiento detallado y organizado de cada evento.

sealed class HomeScreenEvent {
    object OnTaskUpdated : HomeScreenEvent()
    object OnAllTasksDeleted : HomeScreenEvent()
    object OnTaskDeleted : HomeScreenEvent()
}

¿Cómo estructurar un ViewModel para conectar acciones y eventos?

El ViewModel se utiliza para gestionar cambios de estado y acciones en la pantalla. La implementación de un ViewModel implica:

  • Mantener el estado del ViewModel utilizando un canal de eventos.

  • Filtrar tareas completadas y pendientes.

  • Actualizar el estado con cada emisión de datos.

  • Manejar de forma privada los cambios en el estado y procesar las acciones derivadas del flujo de tareas.

    class HomeScreenViewModel : ViewModel() { private val taskLocalDataSourceFake = TaskLocalDataSourceFake() private val _state = mutableStateOf(HomeDataState(listOf(), listOf())) val state: State = _state

    fun onAction(action: HomeScreenAction) {
        when (action) {
            is HomeScreenAction.OnDeleteAllTasks -> {
                // Handle delete all tasks action
            }
            is HomeScreenAction.OnToggleTask -> {
                // Handle toggle task action
            }
        }
    }
    

    }

¿Cómo integrar acciones y eventos correctamente en la interfaz de usuario?

Integrar actions y events implica manejarlos en los elementos interactivos de la interfaz. Cada acción y evento debe ser adecuadamente implementado en el Composables de la pantalla para asegurar reactividad.

  • Acción Delete All: Cuando se selecciona el ícono para eliminar todas las tareas, se debe interaccionar con el ViewModel.

  • Filtro de eventos: Utilizar collect para reaccionar a eventos como mostrar mensajes Toast informativos o cambios inmediatos en la UI.

    fun HomeScreen(onAction: (HomeScreenAction) -> Unit) { // UI composables... FloatingActionButton(onClick = { onAction(HomeScreenAction.OnDeleteAllTasks) }) { Text(text = "Delete All") }

    // Handle actions...
    

    }

Al implementar estas prácticas, estás encargado de diseñar una aplicación Android que no solo organiza su lógica de negocio mejor, sino que también responde ágilmente a las interacciones del usuario, mejorando significativamente la experiencia del mismo.