如何在Dart中创建流?
我基本上知道如何使用它们;例如,侦听元素的onClick流 但是,如何设置自己的流呢?简单的示例 下面是一个完整的工作示例:如何在Dart中创建流?,dart,Dart,我基本上知道如何使用它们;例如,侦听元素的onClick流 但是,如何设置自己的流呢?简单的示例 下面是一个完整的工作示例: 导入'dart:async'; 导入“dart:io”; 班级申请{ 奥涅西特河; 应用程序(){ //创建流控制器并将其流分配给“onExit”。 var controller=新的StreamController(); onExit=controller.stream; //创建一些使用我们的流的类。 流的新用户(this); //当我们退出应用程序时,首先通知所有人
导入'dart:async';
导入“dart:io”;
班级申请{
奥涅西特河;
应用程序(){
//创建流控制器并将其流分配给“onExit”。
var controller=新的StreamController();
onExit=controller.stream;
//创建一些使用我们的流的类。
流的新用户(this);
//当我们退出应用程序时,首先通知所有人。
controller.add('我们正在关闭!');
出口(0);
}
}
类UserOfStream{
UserOfStream(应用程序){
app.onExit.listen((字符串消息)=>打印(消息));
}
}
main()=>新应用程序();
您还可以做一些很酷的事情,比如检查是否有使用controller.hasListener的订户,或者您也可以。请务必检查上的API文档
您可以使用新的StreamController.broadcast()
来允许多个侦听器
用于复制粘贴器
下面是创建流的一种简单方法(复制粘贴程序的伟大片段):
分类{
StreamController _onExitController=新的StreamController.broadcast();
Stream get onExit=>\u onExitController.Stream;
}
然后类就可以访问
\u onExitController
来控制流(例如.add()
)。我刚刚创建了一个名为的新Dart库,以便更轻松地在类上创建自定义事件。以下是一个例子:
class ClassWithEvents实现NotifyPropertyChanged{
字符串_someProperty;
最终事件流_onPropertyChangedEvent=新事件流();
Stream get-onPropertyChanged=>\u-onPropertyChangedEvent.Stream;
最终事件流_onClosedEvent=新事件流();
Stream get onClosed=>\u onClosedEvent.Stream;
字符串get someProperty=>\u someProperty;
设置someProperty(字符串值){
_onPropertyChangedEvent.signal(新的PropertyChangedEventArgs('someProperty',value));
_someProperty=值;
}
关闭(){
_onClosedEvent.signal();
}
}
main(){
var c=新类WithEvents();
c、 onPropertyChanged.listen((PropertyChangedEventArgs args)=>print('changed:name=${args.propertyName}值=${args.value}');
c、 onClosed.listen(())=>print('closed');
c、 someProperty=“test”;
c、 close();
}
除了StreamController
之外,您还可以直接用一个命名构造函数实例化流
:
返回触发一个事件的流(无论Stream.fromFuture()
完成什么)Future
返回将Stream.fromIterable()
元素转换为事件序列的流Iterable
返回定期触发计算事件的流Stream.periodic()
这非常方便,因为您可以编写预期使用流的代码,但对于如何向该类提供事件,您有多种选择。例如:
Stream.fromIterable()
可以在单元测试中用于向一个类触发已知的事件序列,否则该类通常会从文件中读取数据事件。StreamController最近将其默认行为切换为只接受一个侦听器。如果要允许多个侦听器,请将“new StreamController”更改为“new StreamController.broadcast”。(这是针对最前沿的。Trunk目前仍称其为“StreamController.multiSubscription”)。流用户应该知道,单订阅流和广播流之间存在一些显著差异。请参阅。请注意,Stream
和StreamController
是泛型StreamController
提供了一个流
示例。我得到:关闭dart.core.sink的实例