停止从内部事件侦听器中侦听事件

dha*_*nan 3 events dart

我想听一个事件流,然后根据收到的事件有条件地停止收听.

总之,我想用:

var subscription = stream.listen((event) {
    if (f(event)) {
        doStuff();
        subscription.cancel();
    } else {
        doOtherStuff();
    }
});
Run Code Online (Sandbox Code Playgroud)

这显然不起作用; subscription在创建侦听器之前不存在,从而导致错误.

我该怎么做呢?

Flo*_*sch 8

只需在订阅流之前声明订阅:

var subscription;
subscription = stream.listen((event) {
  if (f(event)) {
    doStuff();
    subscription.cancel();
  } else {
    doOtherStuff();
  }
});
Run Code Online (Sandbox Code Playgroud)


dha*_*nan 6

分而治之。

首先,让我们考虑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)

而鲍勃是你的叔叔。

如果两个侦听器的代码基本相同,当然可以将其分离到另一个函数中。