事件发射器
一个基于事件的系统,高度借鉴了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
}
更多示例