Flutter EventBus消息总线

作者: 程序猿在广东 | 来源:发表于2019-05-26 11:48 被阅读17次

    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<ThemeColorEvent>().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主题色功能。

    效果图:


    gfone.gif

    源码地址:

    https://github.com/ChessLuo/flutter_study_app

    支持我的话可以关注下我的公众号,一起学习Android、小程序、跨平台开发~

    my二维码.jpg

    相关文章

      网友评论

        本文标题:Flutter EventBus消息总线

        本文链接:https://www.haomeiwen.com/subject/yxuxtctx.html