我想听一个事件流,然后根据收到的事件有条件地停止收听.
总之,我想用:
var subscription = stream.listen((event) {
if (f(event)) {
doStuff();
subscription.cancel();
} else {
doOtherStuff();
}
});
Run Code Online (Sandbox Code Playgroud)
这显然不起作用; subscription在创建侦听器之前不存在,从而导致错误.
我该怎么做呢?
只需在订阅流之前声明订阅:
var subscription;
subscription = stream.listen((event) {
if (f(event)) {
doStuff();
subscription.cancel();
} else {
doOtherStuff();
}
});
Run Code Online (Sandbox Code Playgroud)
分而治之。
首先,让我们考虑if (f(event))部分。这仅需要与谓词匹配的第一项并执行操作。有两种方法可以做到这一点:
stream.where((event) => f(event)).take(1).listen((event) => doStuff());
Run Code Online (Sandbox Code Playgroud)
这是做事的通用方式,这意味着我们始终使用 Stream 接口。另一种方法可能会避免一些加法和比较操作,需要切换到 Future 接口:
stream.firstWhere((event) => f(event)).then((event) => doStuff());
Run Code Online (Sandbox Code Playgroud)
那只处理条件的第一部分。第二部分呢?我们想要获取所有内容直到条件成立,所以我们将使用takeWhile:
stream.takeWhile((event) => !f(event)).listen((event) => doOtherStuff());
Run Code Online (Sandbox Code Playgroud)
而鲍勃是你的叔叔。
如果两个侦听器的代码基本相同,当然可以将其分离到另一个函数中。
| 归档时间: |
|
| 查看次数: |
1085 次 |
| 最近记录: |