BLoC con eventos y estados tipados en Flutter: ejercicio resuelto
BLoC con eventos y estados tipados en Flutter: ejercicio resuelto
El patrón BLoC (Business Logic Component) separa la lógica de negocio de la UI mediante un flujo unidireccional: la UI dispara eventos, el BLoC los procesa y emite nuevos estados. Esto hace el código testeable y predecible.
Enunciado
Crea una pantalla que cargue una lista de posts desde una fuente remota simulada. Debe gestionar tres estados diferenciados: cargando, cargado y error. El usuario puede refrescar la lista con un botón.
Dependencias
Solución en Flutter
Resultado esperado
- Al abrir la app aparece
CircularProgressIndicator. - Tras 1 segundo se renderiza la lista de 5 posts.
- El botón de refresco vuelve a mostrar el loader y recarga.
- Si descomentamos el
throw, se muestra la pantalla de error con botón de reintento.
Errores frecuentes
- Registrar el mismo tipo de evento dos veces con
on<>: el segundo handler nunca se llama; consolida la lógica en uno solo. - Emitir desde fuera del handler (ej. en un callback asíncrono anidado): usa
emitsolo dentro del handler o a través deEmitterdirectamente. - Estados mutables: si el estado contiene listas, no las modifiques directamente; emite siempre un nuevo estado con una nueva lista.
Diferencia entre Cubit y BLoC aquí
Con Cubit llamarías postsBloc.load() desde la UI. Con BLoC la UI solo dispara PostsLoadRequested() y desconoce cómo se resuelve, lo que facilita:
- Testear el BLoC de forma aislada sin tocar la UI.
- Añadir logging/analytics por evento sin cambiar la UI.
- Transformar o debounce eventos antes de procesarlos.
Aplicación práctica
Este patrón es el estándar en equipos grandes y en apps con flujos de datos complejos: feeds, búsqueda con filtros, carrito de compra, notificaciones en tiempo real.
Siguiente ejercicio recomendado
- Unit test de repositorio en Flutter: ejercicio resuelto
- Arquitectura por capas en Flutter: ejercicio resuelto
- Inyección de dependencias con get_it en Flutter: ejercicio resuelto
- Todos los ejercicios de Flutter
Práctica guiada y siguiente paso
- Más ejercicios de Flutter
- Ejercicios C para reforzar fundamentos
- Programación en C en 100 ejercicios resueltos
- Ver el libro en Amazon (incluido en Kindle Unlimited)
- Suscribirte a la newsletter
FAQ
¿Por qué usar sealed para eventos y estados?
Con sealed el compilador de Dart garantiza que el switch sea exhaustivo: si añades un nuevo evento o estado sin actualizar el switch, el compilador avisa en tiempo de compilación.
¿Cuándo usar BlocListener en lugar de BlocBuilder?
BlocListener es para side effects (mostrar snackbar, navegar, reproducir sonido) que deben ocurrir una vez, no para reconstruir la UI.
¿Se puede combinar BlocBuilder y BlocListener?
Sí, con BlocConsumer, que combina ambos en un solo widget cuando necesitas reaccionar a cambios de estado tanto en UI como con side effects.