Flutter:如何在stream.listen中执行异步函数并等待完成?
Stream监听中执行异步函数的正确实现
你的代码里有两个关键问题导致无法正确await异步函数:
stream.listen的回调没有声明为异步函数,直接用await会报错myFuture里的Future.delayed没加await,延迟逻辑根本没生效
修正后的基础版本
先修复myFuture的延迟问题,再给listen的回调加上async:
Future<int> myFuture(int n) async { await Future.delayed(Duration(seconds: 2)); // 必须加await才会等待延迟 print("Future finished for: $n"); return n; } Stream<int> countStream(int to) async* { for (int i = 1; i <= to; i++) { yield i; } } void main() async { var stream = countStream(10); // 把回调改成async函数,才能使用await stream.listen((n) async { await myFuture(n); }); }
这个版本中,流的每个事件会立即触发异步任务,所有任务是并发执行的——10个任务几乎同时启动,2秒后会一起打印结果。
按顺序处理的版本
如果需要等上一个异步请求完成后,再处理下一条流消息(比如避免并发请求过多),可以用await for循环代替listen:
void main() async { var stream = countStream(10); // await for会按顺序处理每个流事件,前一个异步任务完成才会处理下一个 await for (final n in stream) { await myFuture(n); } }
这个版本会每2秒打印一个结果,总共需要20秒完成所有任务。
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

