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

Flutter Future内for循环Int变量不递增的Firestore操作问题

问题原因

你遇到的是Dart异步编程的典型逻辑冲突:

  • rdvService.createRdv是异步方法,调用后不会立刻执行后续的then回调,而是会把回调放进Dart的事件队列等待执行
  • 外层的for循环是同步执行的,会一次性把所有prestaSelected对应的createRdv请求全部发起,这时候所有createRdv拿到的debutRdv都还是初始值0,还没等到任何then回调执行修改这个变量
  • 等所有同步for循环执行完毕,才会依次处理之前发起的异步请求的then回调,这时候才会修改debutRdv,所以后续的createCreneau能拿到修改后的值,但所有createRdv拿到的都是最初的0

解决方案

把外层同步for循环改成按顺序等待每个异步任务执行完成的逻辑,保证前一个prestaSelect的Rdv创建、Creneau创建、debutRdv递增全部完成后,再处理下一个prestaSelect。

推荐用async/await改写代码,可读性最高:

int debutRdv = 0;

).then((valueEnregistrement) async {
  // 改用await逐个处理,保证顺序执行
  for(PrestationSelected prestaSelect in prestaSelected){
    // 等待当前Rdv创建完成
    final valueRdv = await rdvService.createRdv(
      cli: cli, 
      debutRdv: debutRdv, 
      heureCreneau: heureCreneau, 
      prestaSelect: prestaSelect, 
      valueEnregistrement: valueEnregistrement
    );
    // 批量创建Creneau
    for (int i = 0; i < prestaSelect.duree; i += 15){
      rdvService.createCreneau(
        debutRdv: debutRdv, 
        heureCreneau: heureCreneau, 
        i: i, 
        prestaSelect: prestaSelect, 
        valueRdv: valueRdv
      );
    }
    // 递增变量,下一轮循环就能拿到更新后的值
    debutRdv += prestaSelect.duree;
  }
});

如果不想改写async,也可以用Future.forEach实现顺序执行:

int debutRdv = 0;

).then((valueEnregistrement) {
  return Future.forEach<PrestationSelected>(prestaSelected, (prestaSelect) {
    return rdvService.createRdv(
      cli: cli, 
      debutRdv: debutRdv, 
      heureCreneau: heureCreneau, 
      prestaSelect: prestaSelect, 
      valueEnregistrement: valueEnregistrement
    ).then((valueRdv) {
      for (int i = 0; i < prestaSelect.duree; i += 15){
        rdvService.createCreneau(
          debutRdv: debutRdv, 
          heureCreneau: heureCreneau, 
          i: i, 
          prestaSelect: prestaSelect, 
          valueRdv: valueRdv
        );
      }
      debutRdv += prestaSelect.duree;
    });
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:39:04