首页 > 解决方案 > Dart/Flutter 流生成器在没有订阅者时停止

问题描述

我正在尝试 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();
}

提前感谢您的任何帮助。

麦克风

标签: dartstreamgenerator

解决方案


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

broadcast请记住,普通 Streams 在其生命周期中只接受一个订阅者,如果您计划(重新)订阅多次,则需要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


推荐阅读