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

Dart异步未等待Future.then():Flutter sqflite查询执行顺序异常

Flutter异步forEach导致代码顺序不符合预期的解决方案

兄弟,你遇到的这个问题其实挺典型的——forEach方法根本不会等待异步回调完成!

问题根源

你在forEach的回调里加了async,虽然回调内部用了await,但forEach本身的逻辑是:遍历所有元素、挨个触发回调,然后直接跳去执行后面的代码,完全不管这些异步回调有没有跑完。所以第一个循环里的数据库查询还在后台忙活呢,后面的print('adding regions')和第二个forEach就已经启动了,这就是为什么"adding regions"会先出现在输出里。

解决方案:用for-in循环替代forEach

普通的for-in循环可以和await完美配合,每次迭代都会等当前的异步操作完成后,才会进入下一次循环。这样就能保证第一个循环的所有数据库查询和数据更新都做完,再执行后续代码。

修正后的代码如下:

// 替换第一个forEach为for-in循环,确保异步操作顺序执行
for (var state in stateDetails.keys) {
  var regions = await getRegionsInState(state);
  regions.forEach((region) {
    stateDetails[state][region] = {};
    print(stateDetails);
  });
}

print('adding regions'); 

// 同样替换第二个forEach为for-in循环,避免后续异步顺序问题
for (var state in stateDetails.keys) {
  var regionMap = stateDetails[state];
  for (var region in regionMap.keys) {
    var areas = await getAreasInRegion(region);
    areas.forEach((area) {
      stateDetails[state][region][area] = [];
    });
  }
}

为什么这样改有效?

  • for-in循环会逐次处理每个元素,遇到await就会暂停当前循环,等异步操作返回结果后再继续。
  • 这样第一个循环的所有数据库查询和stateDetails的更新都会全部完成,才会执行print('adding regions')和第二个循环,输出顺序就完全符合你的预期了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:37:15