Dart流取消订阅
你好! 我正试图了解Dart中流的工作原理。Dart流取消订阅,dart,Dart,你好! 我正试图了解Dart中流的工作原理。 下面是一个简单的例子: 我们有Publisher 类发布器{ StreamController _publishCtrl=新的StreamController(); 流媒体发布; 出版者(){ onPublish=_publishCtrl.stream.asBroadcastStream(); } 无效发布(字符串s){ _publishCtrl.add; } } 和读卡器 类读取器{ 字符串名; 读卡器(此名称); 读取(字符串s){ 打印(“我
下面是一个简单的例子:
Publisher
类发布器{
StreamController _publishCtrl=新的StreamController();
流媒体发布;
出版者(){
onPublish=_publishCtrl.stream.asBroadcastStream();
}
无效发布(字符串s){
_publishCtrl.add;
}
}
读卡器
类读取器{
字符串名;
读卡器(此名称);
读取(字符串s){
打印(“我的名字是$name。我读取字符串'$s');
}
}
main()
:
main(){
Publisher Publisher=新Publisher();
读者约翰=新读者(“约翰”);
读卡器史密斯=新读卡器(“史密斯”);
publisher.onPublish.listen(john.read);
publisher.onPublish.listen(smith.read);
对于(变量i=0;i<5;i++){
publisher.publish(“测试消息$i”);
}
}
John
收到5条控制台消息,从读卡器Smith
收到5条消息
我叫约翰。我读取了字符串“测试消息0”
我叫史密斯。我读取了字符串“测试消息0”
我叫约翰。我读了字符串“测试消息1”
我叫史密斯。我读了字符串“测试消息1”
我叫约翰。我读了字符串“测试消息2”
我叫史密斯。我读了字符串“测试消息2”
我叫约翰。我读了字符串“测试消息3”
我叫史密斯。我读了字符串“测试消息3”
我叫约翰。我读了字符串“测试消息4”
我叫史密斯。我读了字符串“测试消息4”
一切正常。但是,如果我尝试更改的周期,使读卡器史密斯
停止接收消息后,消息将只接收读卡器约翰
下面是一个更改函数main()
的示例:
main(){
Publisher Publisher=新Publisher();
读者约翰=新读者(“约翰”);
读卡器史密斯=新读卡器(“史密斯”);
publisher.onPublish.listen(john.read);
var smithSub=publisher.onPublish.listen(smith.read);
对于(变量i=0;i<5;i++){
publisher.publish(“测试消息$i”);
如果(i>2){
取消();
}
}
}
如果您运行此代码,控制台将仅由John发布:
我叫约翰。我读取了字符串“测试消息0”
我叫约翰。我读了字符串“测试消息1”
我叫约翰。我读了字符串“测试消息2”
我叫约翰。我读了字符串“测试消息3”
我叫约翰。我读了字符串“测试消息4”
但是我认为应该有3条来自读者史密斯的信息
请告诉我我所知道的一切是否正确?如果没有,请帮助我理解为什么会发生这种情况
非常感谢。创建一个同步StreamController
StreamController\u publishCtrl=newstreamcontroller(同步:true);
或者允许控制器在发送新项目之前处理这些项目
inti=0;
Future.doWhile(){
i++;
publisher.publish(“测试消息$i”);
如果(i>2){
订阅
..forEach((s)=>s.cancel())
…清晰();
}
返回i<5;
}
谢谢您的回答。我在您建议的问题代码末尾添加了代码,但结果没有改变。通过该程序,我只获得了读者John收到的信息。但在我看来,前3篇文章应该收到,而Smith我没有注意到您已经存储了StreamSubscription
。那么我的答案无效。这只是存储和取消一组流订阅的另一种方法。我想问题在于您的流是异步的,并且发布的项目仅在for循环完成后才传输给侦听器。因此,在的第一个项目到达之前,订阅已被取消代码>。我更新了我的答案。非常感谢你!你太棒了!很多我在Dart中无法理解的东西,我是从你的答案中学到的!