Interacción de Eventos y Estados en UI usando MVVM
Clase 14 de 20 • Curso de Patrones MVVM en Android
Resumen
La arquitectura Model-View-ViewModel (MVVM) es fundamental para estructurar aplicaciones de software de manera más eficiente, especialmente en la gestión de la interfaz de usuario. Al separar los eventos y estados en la UI, se logra una interfaz más intuitiva y fácil de gestionar. Pero, ¿qué diferencias existen entre eventos y estados en el patrón MVVM?
Diferencias fundamentales
- Eventos: son acciones que suceden en la interfaz de usuario, como un clic del usuario. Representan cambios momentáneos que gatillan una respuesta o modificación en la UI.
- Estados: son las condiciones o configuraciones de un componente visual en un momento particular, y son persistentes durante un cierto tiempo. Estos determinan el aspecto y comportamiento de la UI hasta que se produce un nuevo evento.
¿Cómo implementar estados y eventos en la pantalla de búsqueda?
Al crear una pantalla de búsqueda en una aplicación, es crucial gestionar correctamente los estados y eventos para mejorar la experiencia del usuario. Aquí te mostramos cómo se puede lograr esto.
Añadiendo un indicador de progreso
Para informar al usuario de que la búsqueda está en progreso, se puede utilizar un CircularProgressIndicator
. Esto se implementa mostrando el indicador mientras el estado sea "cargando" (searching).
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
when (state.status) {
is Loading -> CircularProgressIndicator()
}
}
Mensaje de "No results"
Si la búsqueda no devuelve resultados, es beneficioso mostrar un mensaje claro al usuario para evitar confusiones:
Text(
text = stringResource(R.string.no_results),
style = MaterialTheme.typography.bodyMedium,
textAlign = TextAlign.Center
)
Gestión de eventos: OnToggle de un TrackableFood
Un evento crítico en la pantalla de búsqueda es el OnToggle
de un alimento rastreable (TrackableFood). Se debe actualizar la UI correctamente respondiendo a este evento:
fun onEvent(event: SearchEvent) {
when (event) {
is SearchEvent.OnToggleTrackableFood -> {
state = state.copy(
trackableFoods = state.trackableFoods.map { food ->
if (food == event.food) {
food.copy(isExpanded = !food.isExpanded)
} else {
food
}
}
)
}
}
}
¿Cómo mejorar la interacción del usuario en el componente TrackableFood?
Para maximizar la interacción en el componente TrackableFood
, es esencial proporcionar UI intuitiva que responda inmediatamente a las acciones del usuario.
Uso de BasicTextField para entrada de datos
Para capturar datos como la cantidad de gramos, se puede emplear un BasicTextField
:
BasicTextField(
value = "",
onValueChange = { newValue -> /* logica de manejo de cambio */ },
keyboardOptions = KeyboardOptions.Default.copy(
imeAction = ImeAction.Done
),
singleLine = true,
modifier = Modifier
.border(BorderStroke(0.5.dp, MaterialTheme.colors.onSurface))
.alignBy(LastBaseline)
.padding(SpacingMedium)
)
Adición de botones de acción
Finalmente, es crucial añadir botones que permitan al usuario realizar acciones como expandir el ítem o confirmar una selección:
IconButton(onClick = { /* logica on click */ }) {
Icon(Icons.Default.Check, contentDescription = stringResource(R.string.track))
}
Estos elementos no solo mejoran la funcionalidad, sino que también aportan una experiencia de usuario más completa y agradable.
Implementando estos conceptos, el manejo de eventos y estados se vuelve más claro y efectivo dentro del MVVM, optimizando el desarrollo y gestión de aplicaciones. Además, la práctica de diferenciar claramente entre eventos y estados facilita el mantenimiento y la escalabilidad de proyectos futuros. ¡Sigue aprendiendo y explorando para implementar estas técnicas con éxito en tus proyectos!