Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events 停止从事件侦听器内部侦听事件_Events_Dart - Fatal编程技术网

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

Events 停止从事件侦听器内部侦听事件,events,dart,Events,Dart,我想监听一个事件流,然后根据接收到的事件有条件地停止监听 简而言之,我想使用: var subscription = stream.listen((event) { if (f(event)) { doStuff(); subscription.cancel(); } else { doOtherStuff(); } }); 这显然不起作用订阅在创建侦听器之前不存在,从而导致错误 我该怎么做?分而治之 首先,让我们考虑(f

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

简而言之,我想使用:

var subscription = stream.listen((event) {
    if (f(event)) {
        doStuff();
        subscription.cancel();
    } else {
        doOtherStuff();
    }
});
这显然不起作用<代码>订阅在创建侦听器之前不存在,从而导致错误

我该怎么做?

分而治之

首先,让我们考虑<代码>(f(事件))< /代码>部分。它只接受与谓词匹配的第一个项并执行操作。有两种方法可以做到这一点:

stream.where((事件)=>f(事件)).take(1).listen((事件)=>doStuff());
这是做事情的一般方式,它意味着我们始终使用流接口。另一种方法可能会避免一些添加和比较操作,需要切换到未来的接口:

stream.firstWhere((事件)=>f(事件))。然后((事件)=>doStuff());
它只处理条件的第一部分。第二部分呢?我们希望在条件成立之前获取所有内容,因此我们将使用
takeWhile

stream.takeWhile((事件)=>!f(事件)).listen((事件)=>doOtherStuff());
鲍勃是你叔叔


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

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

var认购;
订阅=流。侦听((事件){
if(f(事件)){
doStuff();
订阅。取消();
}否则{
doOtherStuff();
}
});

我现在觉得自己很傻。出于某种原因,我认为dart是按值捕获的,而不是按名称捕获的(循环中发生了一些有趣的事情)。