Flutter事件总线如何使用

在Flutter中如何使用事件总线进行组件间的通信?我看到有提到EventBus的库,但不太清楚具体实现步骤。能否提供一个简单的示例代码,说明如何初始化EventBus、发送事件以及在不同组件中接收事件?另外,使用事件总线与Provider或Stream相比有什么优缺点,适合哪些场景?

2 回复

Flutter事件总线通过event_bus库实现。步骤:

  1. 添加依赖:event_bus: ^2.0.0
  2. 创建事件类(如UserLoggedInEvent
  3. 初始化总线:EventBus eventBus = EventBus();
  4. 发送事件:eventBus.fire(UserLoggedInEvent())
  5. 监听事件:eventBus.on<UserLoggedInEvent>().listen((event) { ... })
  6. 取消监听: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

简单场景下,事件总线比全局变量更安全可控。

回到顶部