StatefulBloc<Event, Data> mixin Null safety

A bloc that abstracts and handles loading and submission states

Simplifies state management by handling its status. It's designed to be easily integrable and flexible extension that automatically tracks and sets the commonly used page state types using enum fields instead of the usual inheritance tree.

Steps to use:

You can react to the current status in your widgets (like showing a loading indicator on ActionStatus.ongoing or an error message on ActionStatus.failed). Your state is accessible in

Example usage:

class PageBloc extends Bloc<PageEvent, StatefulState<PageData>>
    with StatefulBloc {
  PageBloc() : super(StatefulState());

  Stream<StatefulState> mapEventToState(PageEvent event) async* {
    if (event is LoadEvent) {
      yield* load(body: () {
        // data loading
        return Outcome.finished(PageData(/* data */));
Superclass Constraints


data → Data?
The current
state StatefulState<Data>
The current state.
read-only, inherited
stream Stream<StatefulState<Data>>
The current state stream.
read-only, inherited
isClosed bool
Whether the bloc is closed. [...]
read-only, inherited
hashCode int
The hash code for this object. [...]
read-only, inherited
runtimeType Type
A representation of the runtime type of the object.
read-only, inherited


load({required FutureOr<Outcome<Data>?> body(), Data? initialData}) Stream<StatefulState<Data>>
Wrapper for a user defined loading logic that handles state setting [...]
submit({required FutureOr<Outcome<Data>?> body(), Data? initialData}) Stream<StatefulState<Data>>
Wrapper for a user defined submission logic that handles state setting [...]
add(Event event) → void
Notifies the Bloc of a new event which triggers all corresponding EventHandler instances. If close has already been called, any subsequent calls to add will be ignored and will not result in any subsequent state changes.
onEvent(Event event) → void
Called whenever an event is added to the Bloc. A great spot to add logging/analytics at the individual Bloc level. [...]
@mustCallSuper, @protected, inherited
transformEvents(Stream<Event> events, TransitionFunction<Event, StatefulState<Data>> transitionFn) Stream<Transition<Event, StatefulState<Data>>>
@Deprecated - Use on<Event> with an EventTransformer instead. Will be removed in v8.0.0 [...]
@Deprecated('Use `on<Event>` with an `EventTransformer` instead. ' 'Will be removed in v8.0.0'), inherited
emit(StatefulState<Data> state) → void
emit should never be used outside of tests. [...]
@visibleForTesting, inherited
on<E extends Event>(EventHandler<E, StatefulState<Data>> handler, {EventTransformer<E>? transformer}) → void
Register event handler for an event of type E. There should only ever be one event handler per event type E. [...]
mapEventToState(Event event) Stream<StatefulState<Data>>
@Deprecated - Use on [...]
@Deprecated('Use on<Event> instead. Will be removed in v8.0.0'), inherited
onTransition(Transition<Event, StatefulState<Data>> transition) → void
Called whenever a transition occurs with the given transition. A transition occurs when a new event is added and a new state is emitted from a corresponding EventHandler. executed. onTransition is called before a Bloc's state has been updated. A great spot to add logging/analytics at the individual Bloc level. [...]
@mustCallSuper, @protected, inherited
transformTransitions(Stream<Transition<Event, StatefulState<Data>>> transitions) Stream<Transition<Event, StatefulState<Data>>>
@Deprecated - Override Stream<State> get stream instead. Will be removed in v8.0.0 [...]
@Deprecated('Override `Stream<State> get stream` instead. Will be removed in v8.0.0'), inherited
close() Future<void>
Closes the event and state Streams. This method should be called when a Bloc is no longer needed. Once close is called, events that are added will not be processed. In addition, if close is called while events are still being processed, the Bloc will finish processing the pending events.
@mustCallSuper, inherited
listen(void onData(StatefulState<Data>)?, {Function? onError, void onDone()?, bool? cancelOnError}) StreamSubscription<StatefulState<Data>>
Adds a subscription to the Stream<State>. Returns a StreamSubscription which handles events from the Stream<State> using the provided onData, onError and onDone handlers.
@Deprecated('Use stream.listen instead. Will be removed in v8.0.0'), inherited
onChange(Change<StatefulState<Data>> change) → void
Called whenever a change occurs with the given change. A change occurs when a new state is emitted. onChange is called before the state of the cubit is updated. onChange is a great spot to add logging/analytics for a specific cubit. [...]
@mustCallSuper, inherited
addError(Object error, [StackTrace? stackTrace]) → void
Reports an error which triggers onError with an optional StackTrace.
@mustCallSuper, inherited
onError(Object error, StackTrace stackTrace) → void
Called whenever an error occurs and notifies BlocObserver.onError. [...]
@mustCallSuper, @protected, inherited
toString() String
A string representation of this object. [...]
noSuchMethod(Invocation invocation) → dynamic
Invoked when a non-existent method or property is accessed. [...]


operator ==(Object other) bool
The equality operator. [...]