事件发射器

一个基于事件的系统,高度借鉴了NodeJS的EventEmitter。此实现使用泛型类型来支持多种数据类型,同时保持直观。

基于JavaScript,适用于Dart和Flutter。

特点

  • 将多个监听器附加到事件。
  • 监听一个主题数据类型
  • 在一个特定主题上发射一条消息,以广播给所有监听器。
  • 使用带有EventEmitter的回调。
  • 使用带有EventStreamEmitter的流。
  • 可以进行扩展以创建自定义事件发射器对象。

入门

使用pub安装

flutter pub add events_emitter

并导入包

import 'package:events_emitter/events_emitter.dart';

用法

EventEmitter events = EventEmitter();

events.on('message', (String data) => print('String: $data'));
events.on('message', (int data) => print('Integer: $data'));

events.emit('message', 'Hello World');
events.emit('message', 42);

// [Output]
// String: Hello World
// Integer: 42

要删除特定监听器,您可以使用该订阅来停止它。

final subscription = events.on('message', ... ));
subscription.cancel();

通过指定类型主题回调来删除监听器。

// Remove all listeners
events.off();

// Remove listeners of type `String`
events.off<String>();

// Remove listeners on topic `message`
events.off(topic: 'message');

// Combine methods above
events.off<String>(topic: 'message');

GitHub

包代码可在Github上获取:Dart – EventEmitter

示例

EventEmitter类可以单独使用,也可以进行扩展以创建自定义事件发射器。

import 'package:events_emitter/events_emitter.dart';

class Person extends EventEmitter {
    String name;

    Person(this.name);

    void say(String message) => emit('say', message);
    void eat(String food) => emit('eat', food);
    void jump(double height) => emit('jump', height);
}

void main() {
  final person = Person('John');

  person.on('say', (String message) => print('${person.name} said: $message'));
  person.on('eat', (String food) => print('${person.name} ate $food'));
  person.on('jump', (double height) => print('${person.name} jumped $height meters'));

  person.say('I\'m a human!');
  person.eat('apple');
  person.jump(0.5);

  // [Output]
  // John said: I'm a human!
  // John ate apple
  // John jumped 0.5 meters
}

更多示例

GitHub

查看 Github