flutter event_bus 底层技术

event_bus 的底层就是 Dart 自带的 dart:async:用 Stream + StreamController 做“事件流”,没有用别的黑科技


1. 核心:StreamController.broadcast

_streamController = StreamController.broadcast(sync: sync);
  • StreamController:管理一条“流”,一边可以往里 add(事件),另一边可以 listen。
  • broadcast:多播流,多个监听者都能收到同一条流里的事件(普通 StreamController 只允许一个 listener)。
  • sync:
    • false(默认):事件在本次 fire() 返回之后、在后续的 microtask 里再分发给监听者(异步)。
    • true:在 fire() 调用时立刻同步把事件交给所有监听者。

所以 event_bus 的“总线”本质上就是:一个广播型的 StreamController。


2. 发事件:fire(event) → streamController.add(event)

void fire(event) {
  streamController.add(event);
}

就是把事件对象放进这条流里,所有正在监听这条流的人都会收到(在 broadcast 下)。


3. 按类型订阅:on<T>() → 对 stream 做 where + cast

Stream<T> on<T>() {
  if (T == dynamic) {
    return streamController.stream as Stream<T>;
  } else {
    return streamController.stream.where((event) => event is T).cast<T>();
  }
}
  • 底层用的还是 同一条 streamController.stream。
  • where((event) => event is T):只保留类型为 T(或子类)的事件。
  • .cast<T>():把 Stream 转成 Stream<T>,方便监听方拿到的就是 T。

所以“按事件类型监听”没有用反射或代码生成,就是 Stream 的过滤 + 类型转换。


总结成一句话

概念 底层技术
事件通道 StreamController.broadcast() 产生的一条 Stream
发事件 StreamController.add(event),即往流里塞数据
收事件 对这条流 listen,即 Dart 的 Stream 订阅
按类型收 对同一条流做 where((e) => e is T).cast<T>()

所以 event_bus 的底层技术就是:Dart 的 Stream + StreamController.broadcast + 按类型过滤,没有额外依赖,也没有用到 Native 或平台特有 API。

posted @ 2026-02-25 14:30  风与叶子  阅读(22)  评论(0)    收藏  举报