Saltar al contenido principal

BLoCs compartidos

lib/core/blocs/ contiene los BLoCs de estado global: se inyectan en el árbol raíz de widgets y están disponibles para cualquier feature sin necesidad de inyección local.

Cuándo un BLoC pertenece al core​

Un BLoC debe vivir en lib/core/blocs/ si cumple al menos uno de estos criterios:

1. Varios features lo consumen simultáneamente​

Si dos o más features independientes leen o modifican el mismo estado, ese estado debe ser global.

// UserBloc es consumido por: perfil, pagos, wallet, header, notificaciones...
// → Pertenece al core
context.read<UserBloc>().state.user;

2. El estado debe persistir entre navegaciones​

Si el estado no debe reiniciarse al salir de una pantalla (el árbol de widgets del feature se destruye), debe estar en el árbol raíz.

// WalletBloc: el saldo debe estar disponible en cualquier pantalla
// sin hacer una nueva petición al navegar
// → Pertenece al core

3. Es infraestructura transversal​

Si el BLoC gestiona funcionalidad de sistema (permisos, tema, notificaciones, sesión), es transversal por definición.

// PermissionsBloc, ThemeBloc, PushNotificationsBloc
// → Pertenecen al core

Cuándo un BLoC NO pertenece al core​

Un BLoC debe vivir en el feature (lib/src/[feature]/presentation/blocs/) si:

  • Solo lo usa un feature.
  • Puede reiniciarse al salir de la pantalla.
  • Gestiona estado efímero de formularios o flows locales.
// El BLoC de "crear producto" solo lo usa el feature de productos
// y puede reiniciarse al salir de la pantalla de creación
// → lib/src/products/presentation/blocs/create_product/

Reglas para agregar un nuevo BLoC al core​

1. Verificar que no existe ya​

Revisar la lista de BLoCs existentes antes de crear uno nuevo. Es posible que el estado ya esté gestionado por un BLoC existente.

2. Estructura de carpeta obligatoria​

lib/
└── core/
└── blocs/
└── [nombre_del_bloc]/
├── [nombre_del_bloc].dart # Barrel file
├── [nombre_del_bloc]_bloc.dart # BLoC
├── [nombre_del_bloc]_event.dart # Eventos
└── [nombre_del_bloc]_state.dart # Estado

3. Inyectar en el árbol raíz​

El nuevo BLoC debe agregarse a la lista de MultiBlocProvider del widget raíz de la app para que esté disponible globalmente.

lib/src/app/app.dart
MultiBlocProvider(
providers: [
BlocProvider(create: (_) => UserBloc()),
BlocProvider(create: (_) => WalletBloc()),
BlocProvider(create: (_) => NewCoreBloc()), // ← nuevo
// ...
],
child: MaterialApp.router(...),
)