Flutter事件总线如何使用
在Flutter中如何使用事件总线进行组件间的通信?我看到有提到EventBus的库,但不太清楚具体实现步骤。能否提供一个简单的示例代码,说明如何初始化EventBus、发送事件以及在不同组件中接收事件?另外,使用事件总线与Provider或Stream相比有什么优缺点,适合哪些场景?
2 回复
Flutter事件总线通过event_bus库实现。步骤:
- 添加依赖:
event_bus: ^2.0.0 - 创建事件类(如
UserLoggedInEvent) - 初始化总线:
EventBus eventBus = EventBus(); - 发送事件:
eventBus.fire(UserLoggedInEvent()) - 监听事件:
eventBus.on<UserLoggedInEvent>().listen((event) { ... }) - 取消监听:
subscription.cancel()
更多关于Flutter事件总线如何使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
Flutter 事件总线(Event Bus)用于组件间解耦通信,常用 event_bus 库实现。以下是核心步骤:
1. 添加依赖
在 pubspec.yaml 中:
dependencies:
event_bus: ^2.0.0
2. 创建事件总线和事件类
// 创建全局事件总线实例
final eventBus = EventBus();
// 定义自定义事件类
class UserLoggedInEvent {
final String username;
UserLoggedInEvent(this.username);
}
class DataRefreshEvent {}
3. 发送事件 在任何地方调用:
eventBus.fire(UserLoggedInEvent('张三'));
4. 监听事件 在 StatefulWidget 中:
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
StreamSubscription? _subscription;
@override
void initState() {
super.initState();
// 监听特定事件
_subscription = eventBus.on<UserLoggedInEvent>().listen((event) {
print('用户登录: ${event.username}');
setState(() {}); // 更新UI
});
}
@override
void dispose() {
_subscription?.cancel(); // 务必取消订阅
super.dispose();
}
}
5. 取消监听
通过 subscription.cancel() 防止内存泄漏。
注意事项:
- 在
dispose()中必须取消订阅 - 使用泛型
on<T>()指定事件类型 - 适合跨组件通信,但复杂状态建议使用 Provider/Bloc
简单场景下,事件总线比全局变量更安全可控。

