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

Flutter中async函数的await未按预期等待执行的原因

问题根本原因

出现打印顺序不符合预期、await没有等待效果,核心是两个异步用法错误:

  • 你调用files.then()时,传入的回调属于异步任务,不会同步阻塞主线程执行,主线程会直接跳过then回调往下运行,所以先打印了--3--。
  • List.forEach方法本身不支持等待内部异步回调执行:哪怕你给forEach传入的函数加了async关键字、内部写了await uploadVideo(),forEach也只会同步把每个回调扔到事件队列,不会等待单个上传任务完成,更不会等所有上传结束,就会立刻往下执行打印--2--。

这种写法下所有视频上传任务都是“触发即不管”的状态,你既没法按顺序等待上传完成,也没法捕获上传过程中的报错,甚至没法确认所有上传是否真的执行成功。

修正方案

不要用forEach处理需要await的异步迭代逻辑,直接用普通for循环遍历(for循环可以正确识别内部await、按顺序等待每个异步任务执行),同时正确等待files Future的结果:

print("--1--");
// 等待文件列表加载完成
final videos = await files;
// 用for循环替代forEach,逐个等待上传完成
for (final video in videos) {
  final uploadSuccess = await uploadVideo(video);
  // 这里可以加上传成功/失败的业务逻辑
}
print("--2--");
// 所有上传完成后再执行后续逻辑
print("--3--");

如果你不需要逐个按顺序上传,想要并行触发所有上传、等全部上传完成后再走后续逻辑,可以用Future.wait:

print("--1--");
final videos = await files;
// 并行上传所有视频,等待全部完成
await Future.wait(videos.map((video) => uploadVideo(video)));
print("--2--");
print("--3--");

额外注意:你写的uploadVideo函数存在一个会导致上传失败的问题:MultipartRequest本身会自动生成带boundary分隔符的multipart/form-data类型Content-Type头,你手动在headers里写死"Content-Type": "application/json"会覆盖默认头,导致服务端无法正确解析上传的文件,这行配置需要删掉;另外MultipartFile的filename参数只传.mp4没有实际文件名,部分做了文件名校验的服务端会直接拒绝请求。

内容的提问来源于stack exchange,提问作者Hadi Hawi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 08:45:38