Side Effect Cubit

An extension to the bloc state management library which serve an additional stream for events that should be consumed only once - as usual called one-time events.

Usage

1. Adding to existing one

For Bloc:

class FeatureBloc extends Bloc<FeatureEvent, FeatureState>
    with SideEffectBlocMixin<FeatureEvent, FeatureState, FeatureSideEffect> {
  FeatureBloc() : super(FeatureState.initial());
}

For Cubit:

  class FeatureCubit extends Cubit<FeatureState>
    with SideEffectCubitMixin<FeatureState, FeatureSideEffect> {
  FeatureCubit() : super(FeatureState.initial());
}

2. Inherit

For Bloc:

class FeatureBloc extends SideEffectBloc<FeatureEvent, FeatureState, FeatureSideEffect>{
  FeatureBloc() : super(FeatureState.initial());
}

For Cubit:

class FeatureCubit extends SideEffectCubit<FeatureState, FeatureSideEffect> {
  FeatureCubit() : super(FeatureState.initial());
}

Emit side effect

class FeatureBloc extends SideEffectBloc<FeatureEvent, FeatureState, FeatureSideEffect>{
  FeatureBloc() : super(FeatureState.initial()){        
    on<ItemClick>(
      (event, emit) {
        produceSideEffect(FeatureSideEffect.openItem(event.id));
      },
    );
  }
}
class FeatureCubit extends SideEffectCubit<FeatureState, FeatureSideEffect> {
  FeatureCubit() : super(FeatureState.initial());

  Future<void> doSomething() {
    produceSideEffect(FeatureSideEffect.openItem(event.id));
  }
}

Listen side effect

BlocSideEffectListener<FeatureBloc, FeatureSideEffect>(
    listener: (BuildContext context, FeatureSideEffect sideEffect) {
        sideEffect.when(
            goToNextScreen: () => Navigator.of(context).pushNamed("/second_screen"),
            showPopupError: (errMsg) {
                // ....
            });
    },
    child: ...
)
BlocSideEffectConsumer<FeatureBloc, FeatureState, FeatureSideEffect>(
    sideEffectListener: (BuildContext context, FeatureSideEffect sideEffect) {

    },
    listenWhen: (previos, current) {},
    listen: (previous, current) {},
    buildWhen: (previous, current) => true,
    builder: (BuildContext context,  FeatureState state) {
        return ...
    }
)

Libraries

side_effect_cubit