You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter:如何在stream.listen中执行异步函数并等待完成?

Stream监听中执行异步函数的正确实现

你的代码里有两个关键问题导致无法正确await异步函数:

  1. stream.listen的回调没有声明为异步函数,直接用await会报错
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:52:53