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

