Events 什么';为我的Google Visualization API包装器提供可重用流的最佳方式是什么?
我正在开发一个基于Dart的包装器,可以在上查看。我为所有可用的图表创建了一个特定于图表的包装类 现在我正在研究底层类的事件。问题在于,在所有图表中,都有而不是共享的各种事件。因此,我需要找到一种方法,将特定的事件类型分配给相应的图表。我已经做的是:Events 什么';为我的Google Visualization API包装器提供可重用流的最佳方式是什么?,events,dart,google-visualization,dart-async,dart-js-interop,Events,Dart,Google Visualization,Dart Async,Dart Js Interop,我正在开发一个基于Dart的包装器,可以在上查看。我为所有可用的图表创建了一个特定于图表的包装类 现在我正在研究底层类的事件。问题在于,在所有图表中,都有而不是共享的各种事件。因此,我需要找到一种方法,将特定的事件类型分配给相应的图表。我已经做的是: 我为api创建了一个包装器: 我创建了一个用于封装一个事件的所有代码的 class EventWrapper<E extends Event> { JsObject _jsChart; String _eventName;
class EventWrapper<E extends Event> {
JsObject _jsChart;
String _eventName;
JsObject _handler;
Stream<E> get onEvent => _streamController.stream;
StreamController<E> _streamController;
...
EventWrapper(this._jsChart, this._eventName, E reviver(p)) {
_streamController = new StreamController.broadcast(onListen: () => _onListen(_eventName), onCancel: () => _onCancel(_eventName));
}
void _onListen(String event) {
_handler = Events.addListener(_jsChart, event, ...);
}
void _onCancel(String event) {
Events.removeListener(_handler);
}
}
class PieChart ... {
Stream<SelectEvent> get onSelect => _selectEventHandler.onEvent;
EventWrapper _selectEventHandler;
PieChart(Element e) : super._(e, "PieChart", vis) {
_selectEventHandler = new EventWrapper<SelectEvent>(jsChart, 'select', (p) => new SelectEvent());
// Other Events
}
// ...
}
NoEvents
,SelectEvent
,SelectReadyEvents
,SelectReadyAnimationFinishEvents
class PieChart ... {
Stream<SelectEvent> get onSelect => _selectEventHandler.onEvent;
EventWrapper _selectEventHandler;
PieChart(Element e) : super._(e, "PieChart", vis) {
_selectEventHandler = new EventWrapper<SelectEvent>(jsChart, 'select', (p) => new SelectEvent());
// Other Events
}
// ...
}
abstract class SelectEventMixin {
Stream<SelectEvent> get onSelect => _selectEventHandler.stream;
final StreamController _selectEventHandler = new StreamController.broadcast(onListen: _onListen);
void _onListen() {
// jsChart is available here
}
}