Skip to content

EventBus и EventBase

Шина событий служит для опционального общения компонентов и сервисов между собой

Событие из себя представляет четкое совершенное действие в прошедшем времени:

  • LoginEvent
  • TestCompletedEvent
  • HasFollowedEvent
dart
// [!code class:bad]
final class SendDiplomaBusEvent extends EventBase {}
dart
// [!code class:good]
final class DiplomaSentEvent extends EventBase {}

Неявная связь компонентов

Событие не должно использоваться для неявной связи бизнес-логики

dart
// [!code class:bad]
final class KnowledgeRefreshBusEvent extends EventBase {} 

...

Future<void> _refresh(BuildContext context) async {
    context.read<FailureScopeNotifier>().refresh();
    context.read<EventBus>().dispatch(const KnowledgeRefreshBusEvent()); 
}

...

EventListener<KnowledgeRefreshBusEvent>(
  listen: (context, event) {
    context.read<KnowledgeSprintTopUserBloc>().refresh(); 
    context.read<KnowledgeSprintStatsBloc>().reload(); 
  },
)
text
// [!code class:good]
Вызывать подобную бизнес-логику напрямую. 
Если тебе нужна подобная конструкция, значит ты что-то делаешь не так.
dart
// [!code class:good]
// В данном случае событие используется, чтобы обновить 
// другой экран в другой части приложения. 
// И эта связь абсолютно опциональна.

Future<void> submitForm() async {
  await _sendDiplomaClient.submit(courseId, state.name);
  eventBus?.dispatch(const DiplomaSentEvent()); 
}

...

EventListener<DiplomaSentEvent>(
    listen: (context, event) => context.read<CertificatesProfileCountBloc>().refresh(), 
),

Авторы

The avatar of contributor named as melvspace melvspace
The avatar of contributor named as Vadim Melnikov Vadim Melnikov

История