如何 return Dart 中的 Stream 而无需循环

How to return a Stream in Dart without looping through it

我的代码中有一个 Stream,我对其进行了一些修改/转换。我想 return 该流作为我的函数的结果。

此代码有效:

Stream<int> returnStream2() async* {
  var list = <int>[1,2,3];
  var result = Stream<int>.fromIterable(list);
  await for( var i in result ) {
    yield i;
  }
}

为什么这个更简单、更易读的版本不起作用?

Stream<int> returnStream1() async* {
  var list = <int>[1,2,3];
  var result = Stream<int>.fromIterable(list);
  return result;
}

我收到一条错误消息“无法 return 来自生成器函数的值(使用 'async*' 修饰符)

我刚刚发现了 yield* 关键字,它解决了我的问题:

Stream<int> returnStream1() async* {
  var list = <int>[1,2,3];
  var result = Stream<int>.fromIterable(list);
  yield* result;
}

要么像您已经发现的那样使用 yield*,要么就不要将函数设为 async* 函数。如果这个流是你唯一产生的东西,你可以这样做:

Stream<int> returnStream1() {
  var list = <int>[1,2,3];
  var result = Stream<int>.fromIterable(list);
  return result;
}

如果你做其他事情,那么yield* stream;await for (var event in stream) yield event;都是选项(它们在处理来自流的错误事件的方式上有所不同,但对于普通数据事件,两者应该是等价的) .