美文网首页
Flutter EventBus 使用

Flutter EventBus 使用

作者: Albert新荣 | 来源:发表于2020-12-18 02:47 被阅读0次
    //订阅者回调签名
    typedef void EventCallback(arg);
    
    class EventBus {
      //私有构造函数
      EventBus._internal();
    
      //保存单例
      static EventBus _singleton = new EventBus._internal();
    
      //工厂构造函数
      factory EventBus()=> _singleton;
    
      //保存事件订阅者队列,key:事件名(id),value: 对应事件的订阅者队列
      var _emap = new Map<Object, List<EventCallback>>();
    
      //添加订阅者
      void on(eventName, EventCallback f) {
        if (eventName == null || f == null) return;
        _emap[eventName] ??= new List<EventCallback>();
        _emap[eventName].add(f);
      }
    
      //移除订阅者
      void off(eventName, [EventCallback f]) {
        var list = _emap[eventName];
        if (eventName == null || list == null) return;
        if (f == null) {
          _emap[eventName] = null;
        } else {
          list.remove(f);
        }
      }
    
      //触发事件,事件触发后该事件所有订阅者会被调用
      void emit(eventName, [arg]) {
        var list = _emap[eventName];
        if (list == null) return;
        int len = list.length - 1;
        //反向遍历,防止订阅者在回调中移除自身带来的下标错位 
        for (var i = len; i > -1; --i) {
          list[i](arg);
        }
      }
    }
    
    //定义一个top-level(全局)变量,页面引入该文件后可以直接使用bus
    var bus = new EventBus();
    

    使用实例:
    页面A监听事件,并做某个操作

    //页面A中
    ...
     //监听登录事件
    bus.on("login", (arg) {
      // do something
    });
    

    页面B发送数据给A,命令A做什么

    //登录页B中
    ...
    //登录成功后触发登录事件,页面A中订阅者会被调用
    bus.emit("login", userInfo);
    

    相关文章

      网友评论

          本文标题:Flutter EventBus 使用

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