Flutter 事件总线 Event Bus

文章目录

概要

提示:这里可以添加技术概要

event_bus 是一个常用的第三方库,用于实现跨组件 / 跨页面的事件通信,基于发布 - 订阅模式(Publish-Subscribe Pattern)工作。它可以帮助你在应用的不同部分之间解耦通信,避免组件之间直接依赖。

核心原理

  1. 定义事件:创建一个类来表示特定的事件(可以携带数据)
  2. 发布事件:当某个操作发生时,通过 EventBus 实例发布一个事件
  3. 订阅事件:在需要响应事件的地方,订阅该事件并定义回调处理在这里插入代码片

基本使用步骤

1.添加依赖

dart 复制代码
dependencies:
  flutter:
    sdk: flutter
  event_bus: ^2.0.0  # 请使用最新版本

2.创建 EventBus 实例

通常会创建一个全局单例,方便在应用各处使用:

dart 复制代码
import 'package:event_bus/event_bus.dart';

// 创建全局事件总线
final EventBus eventBus = EventBus();

3.定义事件类

事件可以是简单的标记,也可以携带数据:

dart 复制代码
// 无数据的事件
class LoginEvent {}

// 带数据的事件
class UserUpdateEvent {
  final String username;
  final int age;

  UserUpdateEvent({required this.username, required this.age});
}

4. 发布事件

在需要触发事件的地方发布:

dart 复制代码
// 发布登录事件
eventBus.fire(LoginEvent());

// 发布带数据的事件
eventBus.fire(UserUpdateEvent(username: "张三", age: 25));

5. 订阅事件

dart 复制代码
// 订阅 LoginEvent
StreamSubscription<LoginEvent>? loginSubscription;

// 订阅 UserUpdateEvent
StreamSubscription<UserUpdateEvent>? userUpdateSubscription;

@override
void initState() {
  super.initState();
  
  // 订阅登录事件
  loginSubscription = eventBus.on<LoginEvent>().listen((event) {
    print("收到登录事件,执行相关操作");
    // 例如:更新UI、跳转页面等
  });
  
  // 订阅用户更新事件
  userUpdateSubscription = eventBus.on<UserUpdateEvent>().listen((event) {
    print("用户更新:${event.username}, ${event.age}");
    // 处理用户信息更新逻辑
  });
} 

6. 取消订阅

为了避免内存泄漏,在组件销毁时必须取消订阅:

dart 复制代码
@override
void dispose() {
  loginSubscription?.cancel();
  userUpdateSubscription?.cancel();
  super.dispose();
}

例如:

  • Bert
  • GPT 初代
  • GPT-2
  • GPT-3
  • ChatGPT

优点

  • 解耦:组件之间无需直接引用,通过事件间接通信
  • 灵活:可以在应用的任何地方发布和订阅事件
  • 轻量:使用简单,学习成本低
  • 支持数据流:基于 Dart 的 Stream 实现,可结合 StreamBuilder 使用

注意事项

1. 内存泄漏 :必须在组件销毁时取消订阅,否则会导致内存泄漏
2. 事件命名 :建议给事件类起清晰的名字,方便维护
3. 事件滥用 :不要过度使用事件总线,简单的父子组件通信建议用回调或 Provider
4. 线程安全:默认情况下,事件处理在发布事件的同一线程执行

适用场景

  • 跨页面通信(如:A 页面操作需要通知 B 页面更新)
  • 深层嵌套组件通信(避免回调地狱)
  • 全局状态变化通知(如:用户登录状态变化、主题切换)

小结

event_bus 是 Flutter 中实现松耦合通信的优秀方案,尤其适合中小型应用。对于大型应用,可能需要更完善的状态管理方案(如 Bloc、Provider),但 event_bus 仍可作为补充。

相关推荐
一只大侠的侠25 分钟前
Flutter开源鸿蒙跨平台训练营 Day 5Flutter开发鸿蒙电商应用
flutter·开源·harmonyos
ZH15455891311 小时前
Flutter for OpenHarmony Python学习助手实战:GUI桌面应用开发的实现
python·学习·flutter
一只大侠的侠2 小时前
Flutter开源鸿蒙跨平台训练营 Day6ArkUI框架实战
flutter·开源·harmonyos
一只大侠的侠2 小时前
Flutter开源鸿蒙跨平台训练营 Day 4实现流畅的下拉刷新与上拉加载效果
flutter·开源·harmonyos
ZH15455891313 小时前
Flutter for OpenHarmony Python学习助手实战:模块与包管理的实现
python·学习·flutter
微祎_4 小时前
Flutter for OpenHarmony:构建一个 Flutter 镜像绘图游戏,对称性认知、空间推理与生成式交互设计
flutter·游戏·交互
消失的旧时光-19434 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
子春一5 小时前
Flutter for OpenHarmony:色彩捕手:基于 CIELAB 色差模型与人眼感知的高保真色彩匹配游戏架构解析
flutter·游戏·架构
ZH15455891315 小时前
Flutter for OpenHarmony Python学习助手实战:数据库操作与管理的实现
python·学习·flutter
Lionel6896 小时前
Flutter 鸿蒙:获取真实轮播图API数据
flutter