如何在不循环的情况下在 Dart 中返回流

问题描述

我的代码中有一个 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,3];
  var result = Stream<int>.fromIterable(list);
  return result;
}

我收到一条错误消息“无法从生成函数返回值(使用 '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,3];
  var result = Stream<int>.fromIterable(list);
  return result;
}

如果您做其他事情,那么 yield* stream;await for (var event in stream) yield event; 都是选项(它们处理来自流的错误事件的方式不同,但对于纯数据事件,两者应该是等效的)。