美文网首页
flutter-EventBus

flutter-EventBus

作者: ChaosHeart | 来源:发表于2022-08-05 17:08 被阅读0次

    flutter 3.0.4

    ///定义一个top-level(全局)变量,页面引入该文件后可以直接使用bus
    var eBus = EventBus();
    
    //订阅者回调签名
    typedef EventCallback = void Function(dynamic arg);
    
    ///事件总线
    class EventBus {
      // 工厂方法构造函数 - 通过UserModel()获取对象1
      factory EventBus() => _getInstance();
    
      // instance的getter方法 - 通过UserModel.instance获取对象2
      static EventBus get instance => _getInstance();
    
      // 静态变量_instance,存储唯一对象
      static EventBus? _instance;
    
      // 获取唯一对象
      static EventBus _getInstance() {
        _instance ??= EventBus._internal();
        return _instance!;
      }
    
      //初始化...
      EventBus._internal() {
        //初始化其他操作...
      }
    
      ///以上为单例...
    
      //保存事件订阅者队列,key:事件名(id),value: 对应事件的订阅者队列
      final _map = <Object, List<EventCallback>>{};
    
      ///添加订阅者-接收事件
      void on(eventName, EventCallback f) {
        if (eventName == null) return;
        _map[eventName] ??= <EventCallback>[];
        _map[eventName]?.add(f);
      }
    
      ///移除订阅者-结束事件
      void off(eventName, EventCallback f) {
        var list = _map[eventName];
        if (eventName == null || list == null) return;
        list.remove(f);
      }
    
      ///已加订阅者-发送事件
      void emit(eventName, [arg]) {
        var list = _map[eventName];
        if (list == null) return;
        int len = list.length - 1;
        //反向遍历,防止在订阅者在回调中移除自身带来的下标错位
        for (var i = len; i > -1; --i) {
          list[i](arg);
        }
      }
    }
    
    
    

    相关文章

      网友评论

          本文标题:flutter-EventBus

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