我基本上知道如何使用它们;例如,听一下元素的onClick流。
但是,你如何设置自己的Streams?
答案 0 :(得分:36)
这是一个完整的工作示例:
import 'dart:async';
import 'dart:io';
class Application {
Stream onExit;
Application() {
// Create a stream controller and assign its stream to "onExit".
var controller = new StreamController();
onExit = controller.stream;
// Create some class that uses our stream.
new UserOfStream(this);
// Whenever we exit the application, notify everyone about it first.
controller.add('we are shutting down!');
exit(0);
}
}
class UserOfStream {
UserOfStream(app) {
app.onExit.listen((String message) => print(message));
}
}
main() => new Application();
您还可以执行很酷的操作,例如检查是否有controller.hasListener
的订阅者,或者signal an error。请务必查看StreamController
上的API文档。
您可以使用new StreamController.broadcast()
来允许多个侦听器。
这是创建流的简单方法(复制贴纸的优秀代码段):
class Something {
StreamController _onExitController = new StreamController.broadcast();
Stream get onExit => _onExitController.stream;
}
然后,班级可以访问_onExitController
来控制流(例如.add()
)。
答案 1 :(得分:2)
我刚刚创建了一个名为event_stream的新Dart库,可以更轻松地在类上创建自定义事件。这是一个例子:
class ClassWithEvents implements NotifyPropertyChanged {
String _someProperty;
final EventStream<PropertyChangedEventArgs> _onPropertyChangedEvent = new EventStream<PropertyChangedEventArgs>();
Stream<PropertyChangedEventArgs> get onPropertyChanged => _onPropertyChangedEvent.stream;
final EventStream _onClosedEvent = new EventStream();
Stream get onClosed => _onClosedEvent.stream;
String get someProperty => _someProperty;
set someProperty(String value) {
_onPropertyChangedEvent.signal(new PropertyChangedEventArgs('someProperty', value));
_someProperty = value;
}
close() {
_onClosedEvent.signal();
}
}
main() {
var c = new ClassWithEvents();
c.onPropertyChanged.listen((PropertyChangedEventArgs<String> args) => print('changed: name=${args.propertyName} value=${args.value}'));
c.onClosed.listen((_) => print('closed'));
c.someProperty = "test";
c.close();
}
答案 2 :(得分:2)
除StreamController
之外,您还可以直接使用其中一个命名构造函数实例化Stream
:
Stream.fromFuture()
返回触发一个事件的流(无论“未来&#39;完成”。
Stream.fromIterable()
返回将Iterable
元素转换为事件序列的流。
Stream.periodic()
返回定期触发计算事件的流。
这非常方便,因为您可以编写期望使用流的代码,但是您可以选择如何将事件提供给该类。例如:Stream.fromIterable()
可以在单元测试中用于将已知的事件序列触发到一个类,否则通常会从文件中读取数据事件。