This package extends the capabilities of Bloc and Cubit, adding the functionality to send and process UI actions, similar to the BlocListener
.
Why use this package?
In many instances, you may want your UI to respond to actions that aren't necessarily tied to a state change. For example, you might want to:
- Display a dialog
- Show a snackbar
- Navigate to a different screen or route
With the "Bloc Action Listener", you can achieve this more conveniently.
Getting Started
1. Define your actions
You can create the actions as needed. These will be dispatched and can be listened to in the UI.
abstract class ExampleAction {}
class ShowTestDialogAction extends ExampleAction {
final String title;
final String content;
ShowTestDialogAction({
required this.title,
required this.content,
});
}
class ShowSnackbarAction extends ExampleAction {
final String content;
ShowSnackbarAction({required this.content});
}
2. Extend your Bloc or Cubit
Use the BlocActionsMixin
to extend your Bloc or Cubit. This mixin provides the addAction()
method which allows you to dispatch the defined actions.
class ExampleCubit extends Cubit<ExampleState> with BlocActionsMixin<ExampleState, ExampleAction> {
ExampleCubit() : super(ExampleInitial());
void onShowTestDialogPressed() {
addAction(
ShowTestDialogAction(
title: 'Test dialog',
content: 'Test dialog message',
),
);
}
void onShowTestSnackbarPressed() {
addAction(ShowSnackbarAction(content: 'Test snackbar message'));
}
}
3. Listen and process actions in the UI
Using the BlocActionListener
widget, you can respond to the dispatched actions in the UI.
BlocActionListener<ExampleCubit, ExampleAction>(
listener: (context, action) {
if (action is ShowTestDialogAction) {
final title = action.title;
final content = action.content;
showDialog(
context: context,
builder: (context) => AlertDialog(title: Text(title), content: Text(content)),
);
}
if (action is ShowSnackbarAction) {
final content = action.content;
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(content)));
}
},
);