flutter_bloc_event_bus 0.0.5 copy "flutter_bloc_event_bus: ^0.0.5" to clipboard
flutter_bloc_event_bus: ^0.0.5 copied to clipboard

Event-driven communication between components built on top of flutter_bloc

flutter_bloc_event_bus #

flutter_bloc_event_bus is a powerful package that combines the benefits of the bloc state management pattern with an event bus system. It allows Flutter applications to efficiently manage state, facilitate event-driven communication between components, and improve maintainability.

📌 Why Use flutter_bloc_event_bus? #

  • Seamless Event-Driven Architecture – Enhances modularity by allowing different components to communicate via an event bus.
  • Built on top of BLoC – Leverages the robustness of bloc for state management while providing an event-driven extension.
  • Decoupled Communication – Enables event-driven communication between widgets, cubits, and blocs without tight coupling.
  • Easy to Implement – Offers simple APIs for publishing, observing, and mediating events.

🚀 Getting Started #

1️⃣ Install the Package #

Add the package to your pubspec.yaml:

dependencies:
  flutter_bloc_event_bus: latest_version
  flutter_bloc: latest_version

Run:

flutter pub get

2️⃣ Usage Examples #

🟢 Using Cubits #

Example: BusPublisherCubit (Emitting Events) #

import 'package:flutter_bloc_event_bus/flutter_bloc_event_bus.dart';

class ExampleBusPublisherState implements Event {
  final int value;

  ExampleBusPublisherState({required this.value});

  @override
  ExampleBusPublisherState copyWith({int? value}) {
    return ExampleBusPublisherState(value: value ?? this.value);
  }
}

class ExampleBusPublisherCubit extends BusPublisherCubit<ExampleBusPublisherState> {
  ExampleBusPublisherCubit(super.initialState);

  void update(int value) => emit(ExampleBusPublisherState(value: value));
}

Example: BusObserverCubit (Observing Events) #

class ExampleBusObserverCubit extends BusObserverCubit<int> {
  ExampleBusObserverCubit(super.initialState);

  @override
  void observe(Object event) {
    if (event is ExampleBusPublisherState) {
      debugPrint('New ExampleBusPublisherState with value: ${event.value} (detected in [ExampleBusObserverCubit])');
    }

    if (event is ExampleBusBridgeState) {
      debugPrint('New ExampleBusBridgeState with value: ${event.value} (detected in [ExampleBusObserverCubit])');
    }
  }
}

Example: BusBridgeCubit (Reacting to Events) #

class ExampleBusBridgeState implements Event {
  final int value;

  ExampleBusBridgeState({required this.value});

  @override
  ExampleBusBridgeState copyWith({int? value}) {
    return ExampleBusBridgeState(value: value ?? this.value);
  }
}

class ExampleBusBridgeCubit extends BusBridgeCubit<ExampleBusBridgeState> {
  ExampleBusBridgeCubit(super.initialState);

  void update(int value) => emit(ExampleBusBridgeState(value: value));

  @override
  void observe(Object event) {
    if (event is ExampleBusPublisherState) {
      debugPrint('New ExampleBusPublisherState with value: ${event.value} (detected in [ExampleBusBridgeCubit])');
    }
  }
}

Example: Running Cubits #

void exampleWithCubits() {
  final exampleBusPublisherCubit = ExampleBusPublisherCubit(ExampleBusPublisherState(value: 0));
  final exampleBusObserverCubit = ExampleBusObserverCubit(0);
  final exampleBusBridgeCubit = ExampleBusBridgeCubit(ExampleBusBridgeState(value: 0));

  exampleBusPublisherCubit.update(1);
  exampleBusBridgeCubit.update(1);
  exampleBusBridgeCubit.update(2);
}

🔵 Using Blocs #

Example: BusPublisherBloc (Dispatching Events) #

class ExampleBusPublisherEvent {
  final int value;

  ExampleBusPublisherEvent({required this.value});
}

class ExampleBusPublisherBloc extends BusPublisherBloc<ExampleBusPublisherEvent, ExampleBusPublisherState> {
  ExampleBusPublisherBloc(super.initialState) {
    on<ExampleBusPublisherEvent>(_update);
  }

  Future<void> _update(ExampleBusPublisherEvent event, Emitter<ExampleBusPublisherState> emit) async => 
      emit(ExampleBusPublisherState(value: event.value));
}

Example: BusObserverBloc (Observing Events) #

class ExampleBusObserverEvent {}

class ExampleBusObserverBloc extends BusObserverBloc<ExampleBusObserverEvent, int> {
  ExampleBusObserverBloc(super.initialState);

  @override
  void observe(Object event) {
    if (event is ExampleBusPublisherState) {
      debugPrint('New ExampleBusPublisherState with value: ${event.value} (detected in [ExampleBusObserverBloc])');
    }

    if (event is ExampleBusBridgeState) {
      debugPrint('New ExampleBusBridgeState with value: ${event.value} (detected in [ExampleBusObserverBloc])');
    }
  }
}

Example: BusBridgeBloc (Handling Events) #

class ExampleBusBridgeEvent {
  final int value;

  ExampleBusBridgeEvent({required this.value});
}

class ExampleBusBridgeBloc extends BusBridgeBloc<ExampleBusBridgeEvent, ExampleBusBridgeState> {
  ExampleBusBridgeBloc(super.initialState) {
    on<ExampleBusBridgeEvent>(_update);
  }

  Future<void> _update(ExampleBusBridgeEvent event, Emitter<ExampleBusBridgeState> emit) async =>
      emit(ExampleBusBridgeState(value: event.value));

  @override
  void observe(Object event) {
    if (event is ExampleBusPublisherState) {
      debugPrint('New ExampleBusPublisherState with value: ${event.value} (detected in [ExampleBusBridgeBloc])');
    }
  }
}

Example: Running Blocs #

void exampleWithBlocs() {
  final exampleBusPublisherBloc = ExampleBusPublisherBloc(ExampleBusPublisherState(value: 0));
  final exampleBusObserverBloc = ExampleBusObserverBloc(0);
  final exampleBusBridgeBloc = ExampleBusBridgeBloc(ExampleBusBridgeState(value: 0));

  exampleBusPublisherBloc.add(ExampleBusPublisherEvent(value: 1));
  exampleBusBridgeBloc.add(ExampleBusBridgeEvent(value: 1));
  exampleBusBridgeBloc.add(ExampleBusBridgeEvent(value: 2));
}

🛠️ Advanced Use Cases #

  • Using BusPublisherBloc for event-driven state management with Blocs.
  • Implementing a global event bus for communication between independent UI elements.
  • Creating a centralized mediator for managing multiple event sources.

🏆 Conclusion #

flutter_bloc_event_bus simplifies event-driven state management, making it easier to decouple components in Flutter applications. Whether you're working with Cubits or Blocs, this package provides a structured way to handle application-wide events.


📜 License #

MIT License


Happy coding! 🚀

0
likes
160
points
137
downloads

Publisher

unverified uploader

Weekly Downloads

Event-driven communication between components built on top of flutter_bloc

Repository (GitHub)

Documentation

API reference

License

MIT (license)

Dependencies

flutter, flutter_bloc

More

Packages that depend on flutter_bloc_event_bus