Dart / Flutter流生成器在没有订阅者时停止

问题描述 投票:0回答:1

我正在尝试Dart / Flutter的Stream函数。

没有任何订阅者,有什么方法可以启动流生成器吗?当我订阅它时它可以工作,但是最后一个订阅者离开后,生成器立即停止。我希望它继续生成(在这种情况下,即使没有订阅者,_count也可以随着时间不断增加)。

我正在尝试模拟流中出现的异步数据(Future.delayed 3 sec只是使其速度变慢,因此使用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个回答
0
投票

您可以使用StreamController将结果发布到其stream属性。Afaik控制器始终接受一个值,但不需要该流的侦听器。无论如何,您都可以使用hasListener进行确认。请记住,StreamControllers在其生命周期内接受一个订阅者,并且如果您打算多次(重新)订阅,则需要breadcast 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) {
      // canel sub after 20 seconds
      sub.cancel();
    }
    if (i == 30) {
      // resub after 30 seconds
      sub = ctrl.stream.listen((value) => print(value));
    }
  }

  ctrl.close();
}


void listener(int value) {
  print(value);
}

还有其他类似目的的类,例如BehaviorSubjectPublishSUbjectReplaySubject

© www.soinside.com 2019 - 2024. All rights reserved.