Dart流取消订阅

Dart流取消订阅,dart,Dart,你好! 我正试图了解Dart中流的工作原理。 下面是一个简单的例子: 我们有Publisher 类发布器{ StreamController _publishCtrl=新的StreamController(); 流媒体发布; 出版者(){ onPublish=_publishCtrl.stream.asBroadcastStream(); } 无效发布(字符串s){ _publishCtrl.add; } } 和读卡器 类读取器{ 字符串名; 读卡器(此名称); 读取(字符串s){ 打印(“我

你好!

我正试图了解Dart中流的工作原理。
下面是一个简单的例子:

  • 我们有
    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中无法理解的东西,我是从你的答案中学到的!