当前位置:网站首页>Flutter adds event listening | subscription

Flutter adds event listening | subscription

2022-06-25 10:23:00 Crazy fox 12138

The singleton pattern

// Subscriber callback signature 
typedef void EventCallback(arg);

class EventBus {
  // Private constructor 
  EventBus._internal();

  // Save single example 
  static EventBus _singleton = EventBus._internal();

  // Factory constructor 
  factory EventBus()=> _singleton;

  // Save the event subscriber queue ,key: Event name (id),value:  Subscriber queue corresponding to the event 
  final _emap = Map<Object, List<EventCallback>?>();

  // Add subscribers 
  void on(eventName, EventCallback f) {
    _emap[eventName] ??=  <EventCallback>[];
    _emap[eventName]!.add(f);
  }

  // Remove subscribers 
  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);
    }
  }

  // Triggering event , After the event is triggered, all subscribers of the event will be called 
  void emit(eventName, [arg]) {
    var list = _emap[eventName];
    if (list == null) return;
    int len = list.length - 1;
    // Reverse traversal , Prevent subscribers from removing subscript misalignment caused by themselves in the callback 
    for (var i = len; i > -1; --i) {
      list[i](arg);
    }
  }
}


// Define a top-level( overall situation ) Variable , The page can be used directly after importing the file bus
var bus = EventBus();

Examples of use

// page A in 
...
 // Listen for login events 
bus.on("login", (arg) {
  // do something
});

// The login page B in 
...
// The login event will be triggered after successful login , page A Subscribers in will be called 
bus.emit("login", userInfo);
```ji


原网站

版权声明
本文为[Crazy fox 12138]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202200543285965.html