惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
G
Google Developers Blog
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
云风的 BLOG
云风的 BLOG
小众软件
小众软件
月光博客
月光博客
Recent Announcements
Recent Announcements
人人都是产品经理
人人都是产品经理
P
Proofpoint News Feed
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
The Cloudflare Blog
博客园_首页
美团技术团队
大猫的无限游戏
大猫的无限游戏
B
Blog
IT之家
IT之家
Jina AI
Jina AI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
C
Check Point Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园 - 风与叶子

Linux libreoffice安装 word转pdf 中文乱码(缺少字体解决) 设计短链接(short URL)系统 羊了个羊小程序通关脚本 Nginx反向代理location与proxy_pass配置规则总结 mysql 删除异常进程脚本 docker 设置国内镜像源 python2.7 升级到 python3.6 aliyun OOS 资源同步【ossutil】 shell之文件路径截取 获取淘宝订单的解决方案——转 mysql实例的连接数max_user_connections 和max_connections 配置的那些事 Git log怎么查看分支提交过哪些文件 一篇文章搞定Git——Git代码管理及使用规范 小程序获取手机号 thinkphp3.2.3 CentOS7 YUM 安装MongoDB 4.0 shell 下载aliplayer 的视频 使用iptables给特定IP或端口限流 多台centos服务器同步更新代码文件 Nginx1.14.0+ModSecurity实现简单的WAF
flutter event_bus 底层技术
风与叶子 · 2026-02-25 · via 博客园 - 风与叶子

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。