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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.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
Dart 倾听未来';s列表项_Dart - Fatal编程技术网

Dart 倾听未来';s列表项

Dart 倾听未来';s列表项,dart,Dart,我有了未来的戴夫dave是一个未来,但在未来它可能会变成一个流。因此,我提前思考并同意他这样说: var daveSub = Stream<List<Directory>> .fromFuture(dave()) .listen((List<Directory> folders) { ... }); var daveSub = Stream<List<Directory>> .fromFuture(dave

我有了未来的戴夫
dave
是一个未来,但在未来它可能会变成一个流。因此,我提前思考并同意他这样说:

var daveSub = Stream<List<Directory>>
    .fromFuture(dave())
    .listen((List<Directory> folders) {
  ...
});
var daveSub = Stream<List<Directory>>
    .fromFuture(dave())
    .listen((List<Directory> folders) {

  for (final Directory folder in folders) {
    if (folder.path.startsWith('/root/folder')) {
      doStuff(folder);
      daveSub.cancel();
    }
  }

});
Stream<Directory>
    .fromFuture(dave())
    .firstItemWhere((Directory folder) => folder.path.startsWith('/root/folder'))
    .then((Directory folder) {
  doStuff(folder);
});
Stream<List<Directory>>.fromFuture(dave())
                .expand((List<Directory> _folders) => _folders)
                .listen((Directory _folder) {
                  doStuff();
                });
但这在我看来并不正确,尤其是对于监听器内部的循环。使用Future的基本功能,它看起来也不太合适:

dave()
    .then((List<Directory> folders) {

  for (final Directory folder in folders) {
    if (folder.path.startsWith('/root/folder')) {
      doStuff(folder);
    }
  }

});
或者这个:

dave()
    .firstItemWhere(((Directory folder) => folder.path.startsWith('/root/folder')) {
  doStuff(folder);
});
或者至少:

dave()
    .then((List<Directory> folders) {
  for (final Directory folder in folders if folder.path.startsWith('/root/folder')) {
    doStuff(folder);
  }
});
dave()
。然后((列出文件夹){
for(文件夹中的最终目录文件夹,如果是folder.path.startsWith('/root/folder')){
多斯塔夫(文件夹);
}
});

找到正确的循环后,可以使用break子句退出循环:

var daveSub=Stream
.fromFuture(dave())
.listen((列出文件夹){
用于(文件夹中的最终目录文件夹){
if(folder.path.startsWith('/root/folder')){
多斯塔夫(文件夹);
打破
}
}
daveSub.cancel();
});

侦听器中的循环有什么问题?

您应该能够找到您正在查找的项目,而无需处理订阅,请看以下示例:

void main() async {
 var stream = Stream.fromIterable([[1,2,3],[4,5,6],[7,8,9]]);
  var item = await stream.expand((e) => e)
               .firstWhere((e) => e == 3, orElse: () => null);
  
  if (item != null) {
     // Do stuff 
  }
}


正如@lrn所建议的,
expand()
就是我要找的。类似的流如下所示:

var daveSub = Stream<List<Directory>>
    .fromFuture(dave())
    .listen((List<Directory> folders) {
  ...
});
var daveSub = Stream<List<Directory>>
    .fromFuture(dave())
    .listen((List<Directory> folders) {

  for (final Directory folder in folders) {
    if (folder.path.startsWith('/root/folder')) {
      doStuff(folder);
      daveSub.cancel();
    }
  }

});
Stream<Directory>
    .fromFuture(dave())
    .firstItemWhere((Directory folder) => folder.path.startsWith('/root/folder'))
    .then((Directory folder) {
  doStuff(folder);
});
Stream<List<Directory>>.fromFuture(dave())
                .expand((List<Directory> _folders) => _folders)
                .listen((Directory _folder) {
                  doStuff();
                });
Stream.fromFuture(dave())
.展开((列出\u文件夹)=>\u文件夹)
.listen((目录_文件夹){
doStuff();
});

它回答了你的问题吗?我知道这一点,但我不确定它如何能帮助我在这种情况下做得更好。玩具可能想将
更改为
,或者通过
var Stream=future.asStream().expand((x)=>x)。然后在一个类型中得到一个元素,而不仅仅是一个元素列表。那么
firstWhere
应该可以工作了。酷!使用expand()是一个好策略吗?expand比for loop有什么优势吗?我完全忘记了
break
,这比取消订阅或迭代完整的未来结果要好得多!不客气!如果您喜欢,请接受答案;)我可以将Future插入Future.value()吗?您可以插入任何类型,这只是一个示例,顺便说一句,使用
Future.asStream
Stream。fromFuture
没有区别,因为aikit不适用于我,您的示例会返回整个列表,而不是一个项目您的代码中一定有错误,请分享你所做的。我复制了你的代码并插入了打印(项目);进入if。我发现没有
e
,因为它得到的唯一
e
[1,2,3,4,5]
,这是!=3.此外,我能得到的唯一物品是
[1,2,3,4,5]