使用 Stream.periodic 时如何取消 Stream?

ins*_*han 12 dart

我在取消使用 Stream.periodic 构造函数创建的流时遇到问题。下面是我尝试取消流。但是,我很难从内部作用域中提取“计数”变量。因此,我无法取消订阅。

import 'dart:async';

void main() {
  int count = 0;
  final Stream newsStream = new Stream.periodic(Duration(seconds: 2), (_) {
    return _;
  });

  StreamSubscription mySubscribedStream = newsStream.map((e) {
    count = e;
    print(count);
    return 'stuff $e';
  }).listen((e) {
    print(e);
  });

  // count = 0 here because count is scoped inside mySubscribedStream
  // How do I extract out 'count', so I can cancel the stream?
  if (count > 5) {
    mySubscribedStream.cancel();
    mySubscribedStream = null;
  }
}
Run Code Online (Sandbox Code Playgroud)

Gün*_*uer 4

我宁愿使用take(5)而不是检查> 5然后取消

final Stream newsStream = new Stream.periodic(Duration(seconds: 2), (_)  => count++);

newsStream.map((e) {
    count = e;
    print(count);
    return 'stuff $e';
  }).take(5).forEach((e) {
    print(e);
  });
Run Code Online (Sandbox Code Playgroud)

  • 没有订阅者的流什么也不做。它不再有指向它的活动引用,并且将被垃圾收集。 (8认同)
  • 谢谢,但我仍然需要知道如何取消 Stream.periodic。 (6认同)
  • 存储“listen(...)”返回的订阅并对其调用“cancel()”。 (5认同)
  • @SimonL period通常应该继续运行。例如,如果您只想在显示时在 Flutter 小部件中使用它,则可以在“dispose()”中取消订阅。为此,您需要使用 `var sub = newsstream.listen(...);` 而不是 `map(...)`,以便您可以调用 `sub.cancel();` 垃圾收集器将采取照顾它,但如果该小部件不再附加,并且流在 GC 到达它之前仍然发出事件,则当代码依赖于仍附加的小部件时,事件处理程序代码可能会导致错误。 (2认同)