我有一个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?
答案 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;
}