0

我的代码中有一个 Stream,我已经对其进行了一些修改/转换。我想返回那个 Stream 作为我的函数的结果。

此代码有效:

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;
}

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

4

2 回答 2

0

要么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;两者都是选项(它们在处理来自流的错误事件的方式上有所不同,但对于纯数据事件,两者应该是等价的)。

于 2021-03-08T15:29:31.053 回答
0

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

Stream<int> returnStream1() async* {
  var list = <int>[1,2,3];
  var result = Stream<int>.fromIterable(list);
  yield* result;
}
于 2021-03-08T13:20:17.387 回答