如何对Stream进行map()直到在Dart中将其取消?

时间:2019-02-20 18:14:52

标签: asynchronous dart

我有一个Stream来自数据库查询。我相信查询将运行一段时间,并在运行时产生值,因此我希望能够在项目可用时立即向用户显示。

但是,一旦用户选择了一个项目,我希望取消Stream。

我在写这篇文章时遇到了麻烦,因为我看不到如何都能获得对流的订阅,该订阅可以在以后取消,并且同时映射其元素,以便映射的流的使用者可以处理由原始流制作的项目。

基本上,我认为我需要一个CancellableStream之类的东西,但在Dart SDK中看不到类似的东西。

到目前为止,我已经尝试过类似的方法:

final subscription = cursor.listen((entry) => process(entry));
// now I can cancel the subscription when needed, but how to
// return the processed items to the caller?

final processed = cursor.map((entry) => process(entry));
// now I have the processed Stream I wanted, but how can I cancel it?

2 个答案:

答案 0 :(得分:2)

我认为where(...)使用hasPicked的状态应该可以满足您的要求

bool hasPicked = false;
...
final processed = cursor.where((entry) => !hasPicked).map((entry) => process(entry));

用户选择了一个后,将hasPicked设置为true

答案 1 :(得分:0)

基于https://www.dartlang.org/articles/libraries/creating-streams ...

这是可取消流的简单实现:

class CancellableStream<T> {
  final Stream<T> _originalStream;
  bool _isCancelled = false;

  CancellableStream(this._originalStream);

  Stream<T> get stream async* {
    await for (final item in _originalStream) {
      if (_isCancelled) break;
      yield item;
    }
  }

  void cancel() => _isCancelled = true;
}