Contenido del curso
Fundamentos de BLoC y Firebase
Navegación y Autenticación
- 10

BlocProvider y RepositoryProvider en Flutter
06:24 min - 11

Pantalla de login con BlocListener en Flutter
11:12 min - 12

Creación y Validación de Formularios en Flutter con Firebase
17:43 min - 13

Rutas en Flutter con GoRouter y Firebase Auth
15:46 min - 14

Conectar botón de login con Firebase Auth
11:34 min - 15

Cómo implementar logout con Firebase y GoRouter
10:30 min
Diseño Avanzado en iOS
Integración con Firestore usando BLoC
- 18

Modelo e repositório Firestore para BLoC
16:43 min - 19

Manejo de Estados y Eventos en Flutter con Bloc para Finanzas
09:57 min - 20

Agregar transacciones en Firebase con Flutter Bloc
06:41 min - 21

Eliminar Transacciones con Firebase en Flutter
05:29 min - 22

MultiBlocProvider con auth y transacciones en Flutter
Viendo ahora
Funcionalidades con BLoC
- 23

BlocBuilder para mostrar datos en Flutter
15:13 min - 24

Integración de Gráficas y Estados en Aplicaciones Flutter
11:50 min - 25

Creación de Listados Dinámicos en Aplicaciones Flutter
18:25 min - 26

Configuración de Balance y Estados en Pantalla de Wallet
07:12 min - 27

Lista de Transacciones en Aplicaciones Móviles
04:02 min - 28

Agregar Transacciones en Firebase con Flutter y Bloc
10:55 min - 29

Eliminar transacciones en Flutter con BLoC y Firebase
03:57 min
Testing
MultiBlocProvider con auth y transacciones en Flutter
Resumen
Cuando tu app Flutter necesita manejar más de un flujo de estado, como autenticación y transacciones, un solo BlocProvider se queda corto. La solución pasa por usar MultiBlocProvider y MultiRepositoryProvider, dos widgets que permiten registrar varios blocs y repositorios en el árbol de la aplicación para que cualquier pantalla acceda a ellos sin fricción.
Esta guía está pensada para desarrolladores Flutter que ya trabajan con el patrón BLoC y quieren escalar su arquitectura cuando aparece un segundo dominio de negocio, por ejemplo un módulo de ingresos y gastos junto al de auth.
Por qué pasar de BlocProvider a MultiBlocProvider
Un BlocProvider simple solo expone un bloc hacia abajo en el árbol de widgets. En cuanto necesitas escuchar AuthBloc y IncomeExpenseBloc al mismo tiempo, anidar providers se vuelve ruidoso y difícil de leer.
El MultiBlocProvider acepta una lista de providers, así que puedes declarar todos los blocs en un solo lugar y mantener el child limpio para desplegar las rutas de la aplicación.
¿Qué hace un MultiBlocProvider? Combina varios
BlocProvideren una sola lista, evitando anidamientos. Recibe un arreglo enprovidersy unchildúnico donde vive el resto de la app.
Cómo registrar AuthBloc e IncomeExpenseBloc juntos
Dentro de MultiBlocProvider declaras la lista providers con cada bloc creado a partir de su repositorio correspondiente. La clave está en obtener el repositorio con RepositoryProvider.of<T>(context) para que el bloc reciba la dependencia ya inyectada.
La estructura queda así en pseudocódigo:
dart MultiBlocProvider( providers: [ BlocProvider<AuthBloc>( create: (context) => AuthBloc( RepositoryProvider.of<AuthRepository>(context), ), ), BlocProvider<IncomeExpenseBloc>( create: (context) => IncomeExpenseBloc( RepositoryProvider.of<IncomeExpenseRepository>(context), )..add(TransactionsEvent()), ), ], child: MyApp(), )
En el caso de IncomeExpenseBloc se dispara desde el inicio el evento add de transactions, porque es el que más se va a utilizar al cargar la app. Esa llamada inicial precarga las transacciones para que la UI ya tenga datos cuando se renderice.
Cómo agrupar repositorios con MultiRepositoryProvider
Los blocs dependen de repositorios, así que estos deben existir antes en el árbol. Aquí entra MultiRepositoryProvider, que sigue exactamente la misma lógica: una lista de RepositoryProvider y un child.
El orden importa: primero envuelves la app con MultiRepositoryProvider, y dentro colocas el MultiBlocProvider. Así los blocs pueden leer los repositorios vía context sin errores.
¿Por qué separar repositorios y blocs en dos providers distintos? Porque los repositorios manejan acceso a datos (API, base local) y los blocs manejan estado de UI. Separarlos respeta el principio de responsabilidad única y facilita testear cada capa.
Estructura de los repositorios de auth y transacciones
Dentro de la lista declaras un RepositoryProvider por cada fuente de datos. En este flujo se registran AuthRepository para el módulo de autenticación e IncomeExpenseRepository para el módulo de finanzas.
La forma esperada es:
dart MultiRepositoryProvider( providers: [ RepositoryProvider<AuthRepository>( create: (context) => AuthRepository(), ), RepositoryProvider<IncomeExpenseRepository>( create: (context) => IncomeExpenseRepository(), ), ], child: MultiBlocProvider( // providers de blocs child: MaterialApp(...), ), )
Cada RepositoryProvider usa su propio create, por eso el create general que tenías en el RepositoryProvider único desaparece cuando migras al multi.
Cómo queda el árbol final de providers
Con ambos multi providers configurados, la app queda con dos capas claras de inyección de dependencias.
- Capa externa:
MultiRepositoryProviderconAuthRepositoryeIncomeExpenseRepository. - Capa intermedia:
MultiBlocProviderconAuthBloceIncomeExpenseBloc, ambos consumiendo los repositorios anteriores. - Capa interna: el
child, que despliega todas las rutas o el widget raíz de la aplicación.
De esta forma cualquier pantalla puede llamar a context.read<AuthBloc>() o context.read<IncomeExpenseBloc>() sin importar dónde esté ubicada en el árbol. Los blocs escuchan eventos como add para transacciones y mantienen el estado sincronizado con la UI.
¿Cuándo conviene usar MultiBlocProvider en lugar de varios BlocProvider anidados? Siempre que tengas dos o más blocs globales. Mejora legibilidad, evita anidación profunda y centraliza la configuración de estado en un único punto.
Con esta arquitectura ya puedes consumir la información de autenticación y de transacciones desde cualquier vista. ¿Tú cómo organizas tus providers cuando agregas un tercer módulo a la app? Cuéntame en los comentarios.