Flutter EventBus消息总线

1、前言

在APP中,我们经常会需要一个广播机制,用以跨页面事件通知。Flutter中我们可以使用event_bus提供的事件总线功能来实现一些状态的更新,其核心是基于Dart Streams(流)。事件总线通常实现了订阅者模式。订阅者模式包含发布者和订阅者两种角色,可以通过事件总线来触发事件和监听事件。接下来我将学习event_bus,并异步实现主题颜色的更新。

2、Flutter中集成EventBus

pubspec.yaml文件中添加event_bus,当前版本1.1.0。

event_bus: ^1.1.0

在Dart代码中引入:

import 'package:event_bus/event_bus.dart';

现在已经引入event_bus插件库了,接下来可以在对应类中使用event_bus,也许使用flutter插件库都是同样的步骤吧!

3、创建EventBus

通常每个应用程序只有一个事件总线,但可以设置多个事件总线以对一组特定事件进行分组,因此新建event_bus.dart类,在类中创建EventBus实例,使其能够在其他类中被使用,并定义了ThemeColorEvent 通知修改主题颜色的事件:

import 'package:event_bus/event_bus.dart';
/// 创建EventBus
EventBus eventBus = EventBus();
 
/// Event 修改主题色
class ThemeColorEvent {
  String colorStr;
 
  ThemeColorEvent(this.colorStr);
}

这里是通过 EventBus eventBus = EventBus(); 来创建EventBus实例的,先看一下库源码EventBus()方法:

  EventBus({bool sync = false})
      : _streamController = StreamController.broadcast(sync: sync);

其创建EventBus实例过程中,是通过StreamController.broadcast方法来实现事件总线的创建,前面说过EventBus核心是基于Dart Streams(流),StreamController.broadcast就是Streams的一种广播流,这里可以看到EventBus创建时还可以传入一个sync,默认sync为false,即异步操作;当sync为true,即为同步操作。

4、注册事件监听器

接下来我在main.dart程序入口类中,注册了监听修改主题颜色的监听器,用于接收一个颜色值,然后setState更新主题状态。

  //订阅eventbus
    _colorSubscription = eventBus.on().listen((event) {
      Color color = AppColors.getColor(event.colorStr);
      setState(() {
        _primaryColor = color;
      });

由于EventBus其核心是基于Dart Streams(流),这里我定义了StreamSubscription _colorSubscription; 相当于订阅者,因此在退出页面的时候也要取消订阅,防止内存泄漏:

@override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    //取消订阅
    _colorSubscription.cancel();
  }

5、发送事件

我新建了一个子页面,子页面中有个输入框,用于输入颜色值,然后点击按钮,就会带上输入框的颜色值,执行EventBus发送修改主题颜色的事件:

//发送订阅消息去修改颜色
eventBus.fire(ThemeColorEvent(_colorController.text));

这样在前面的main.dart类中注册的监听器即可接收到子页面传过来的颜色值,这边便实现了修改APP主题色功能。

效果图: 

你可能感兴趣的:(flutter)