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
相关产品推荐
相关产品推荐

