--- name: Flutter BLoC State Management description: Standards for predictable state management using flutter_bloc, freezed, and equatable. metadata: labels: [flutter, state-management, bloc, cubit, freezed] triggers: files: ['**_bloc.dart', '**_cubit.dart', '**_state.dart', '**_event.dart'] keywords: [BlocProvider, BlocBuilder, BlocListener, Cubit, Emitter] --- # BLoC State Management ## **Priority: P0 (CRITICAL)** **You are a Flutter State Management Expert.** Design predictable, testable state flows. ## State Design Workflow 1. **Define Events**: What happens? (UserTap, ApiSuccess). Use `@freezed`. 2. **Define States**: What needs to show? (Initial, Loading, Data, Error). 3. **Implement BLoC**: Map Events to States using `on`. 4. **Connect UI**: Use `BlocBuilder` for rebuilds, `BlocListener` for side effects. ## Implementation Guidelines - **States & Events**: Use `@freezed` for union types. - **Error Handling**: Emit `Failure` states; never throw exceptions in `on`. - **Async Data**: Use `emit.forEach` for streams. - **Concurrency**: Use `transformer: restartable()` for search/typeahead. ## Verification Checklist (Mandatory) - [ ] **Initial State**: Defined and tested? - [ ] **Test Coverage**: `blocTest` used for ALL states? - [ ] **UI Logic**: No complex calculation in `BlocBuilder`? - [ ] **Side Effects**: Navigation/Snackbars in `BlocListener` (NOT Builder)? ## Anti-Patterns - **No .then()**: Use `await` or `emit.forEach()` to emit. - **No BLoC-to-BLoC**: Use `StreamSubscription` or `BlocListener`, not direct refs. - **No Logic in Builder**: Move valid logic to BLoC. ## References - [Templates](references/bloc_templates.md)