【问题标题】:Dart/Flutter stream generator stops when no subscriberDart/Flutter 流生成器在没有订阅者时停止
【发布时间】:2020-03-03 06:38:28
【问题描述】:

我正在试用 Dart/Flutter 的 Stream 功能。

有没有办法在没有订阅者的情况下启动流生成器?它在我订阅它时起作用,但在最后一个订阅者离开后生成器立即停止。我希望它继续生成(在这种情况下,即使没有订阅者,_count 也可以随着时间的推移而不断增加)。

我正在尝试模拟流中出现的异步数据(Future.delayed 3 秒只会减慢它的速度),因此使用 Stream.periodic 并不能完全减少它。

void main() {
  Stream<int> generateStream() async*{
    int _count = 0;
    while (true) {
      await Future.delayed(Duration(seconds: 3));
      print(_count);
      yield _count++;
    }
  }

  generateStream();
}

提前感谢您的帮助。

迈克

【问题讨论】:

    标签: dart stream generator


    【解决方案1】:

    您可以使用StreamController 将结果发布到其stream 属性。

    请记住,普通 Streams 在其生命周期内只接受一个订阅者,如果您计划多次(重新)订阅,则需要broadcast StreamControllers。

    这是一个例子:

    import 'dart:async';
    
    void main() async {
      StreamController<int> ctrl = StreamController<int>.broadcast();
      Stream<int> stream = ctrl.stream;
    
      // a handle to manage the current subscription
      StreamSubscription<int> sub;
    
      for (int i = 0; i < 60; i++) {
        // wait for 0.2s
        await Future.delayed(Duration(milliseconds: 200));
    
        // add a value to the controller
        ctrl.add(i);
    
        if (i == 10) {
          // add listener
          sub = stream.listen(listener);
        }
        else if (i == 20) {
          // cancel sub after 4 seconds
          sub.cancel();
        }
        if (i == 30) {
          // resub after 6 seconds
          sub = stream.listen(listener);
        }
      }
    
      ctrl.close();
    }
    
    
    void listener(int value) {
      print(value);
    }
    

    还有其他类似用途的类,如BehaviorSubjectPublishSUbjectReplaySubject

    【讨论】:

    • 感谢您的回答。有用。我想我一开始就找错地方了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    相关资源
    最近更新 更多