bloc
| Package | Kind | Provides the role | Needs | Choose with |
|---|---|---|---|---|
smf_bloc | infrastructure | State management | nothing | -m bloc |
bloc manages the state of screens with BLoC, through flutter_bloc 9.
What it adds to the app
The module adds flutter_bloc: ^9.1.1 to the dependencies and no code, since BLoC needs neither a widget around the app nor start-up code.
In the guide for coding agents of the app, the module writes the section "State management". The state of a screen is a Cubit in the directory of its feature. The screen provides it with a BlocProvider and passes the state on to a view that imports no flutter_bloc. State that several screens read gets a BlocProvider around the root widget in lib/main.dart. After an await, a Cubit checks isClosed before it calls emit(). And a widget talks only to a Cubit, never to a service or a DI container.
Features with state
A feature that keeps state supports BLoC through a variant keyed by the id of this module, bloc. The variant brings the Cubits or Blocs of the feature's screens and provides them where the screens need them. Usually the feature's composition file creates them, with the services they need. The variant depends on flutter_bloc with the constraint any, so the version comes from this module. See Write a feature module.
Among the built-in features, sign_in has such a variant:
- Each of its screens has a cubit in a file next to it, such as
SignInCubitinlib/features/sign_in/sign_in_cubit.dart. The screen provides its cubit with aBlocProviderand builds its view from the state with aBlocBuilder. The view is a plain Flutter widget that imports nothing offlutter_bloc. lib/features/sign_in/sign_in_composition.dartcreates the cubits. A cubit takes what it needs through its constructor, here the session of the app, so a test creates one with a session of its own.- State that several screens read has its
BlocProvideraround the root widget, inrunApp(). The module puts itsSessionCubitthere, and a widget reads who uses the app withcontext.watch<SessionCubit>().state. - A cubit checks
isClosedafter anawait, since the user may have left the screen while the call was on its way.
home, onboarding and settings keep no state in a state manager, so they work the same with bloc and without it.
Choosing it
smf create asks which module manages the state of the app, and offers riverpod and None as well. To choose it without the question:
smf create my_app -m bloc
An app has at most one module that manages its state.