问题描述
我的代码中有一个 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;
都是选项(它们处理来自流的错误事件的方式不同,但对于纯数据事件,两者应该是等效的)。