Int в цикле For внутри будущего, не увеличивающего Флаттер/Firestore

# #flutter #for-loop #google-cloud-firestore #future

Вопрос:

Я пытаюсь установить множество документов Firestore с циклом for, с увеличивающейся переменной, но этот не увеличивается, как это происходит… Вот код

 int debutRdv = 0;

).then((valueEnregistrement) => {
 for(PrestationSelected prestaSelect in prestaSelected){
  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 = debutRdv  = prestaSelect.duree
   })
  },
 

Дело в том, что переменная debutRdv не увеличивается, как я хочу. Он правильно увеличивается во втором цикле (createCreneau), но не в первом цикле (createRdv). Это похоже на то, что функция createRdv выполнялась столько раз, сколько длился мой предварительно выбранный список, прежде чем запустить «тогда»…
Я действительно не понимаю, что происходит.

Например, результат должен быть :

 *debutRdv Rdv1 = 0  
debutRdv Rdv1Creneau 1 = 0  
debutRdv Rdv1Creneau 2 = 0  
debutRdv Rdv2 = 30  
debutRdv Rdv2Creneau 1 = 30  
debutRdv Rdv2Creneau 2 = 30*  
 

но это так:

 *debutRdv Rdv1 = 0  
debutRdv Rdv1Creneau 1 = 0  
debutRdv Rdv1Creneau 2 = 0  
debutRdv Rdv2 = 0  
debutRdv Rdv2Creneau 1 = 30  
debutRdv Rdv2Creneau 2 = 30*  
 

Пожалуйста, помогите.

Комментарии:

1. Просто предложение: я нахожу синтаксис async/await более легким для отладки и чтения, чем синтаксис «тогда». Я предлагаю это изменение, потому что у вас есть вложенные фьючерсы с циклами For, и это быстро усложнится.

Ответ №1:

Проблема: ваша первая инструкция для входа не будет ждать завершения rdvService.createRdv().затем() перед переходом к следующему элементу, что приводит к неопределенному (непредсказуемому) порядку выполнения ваших функций.

Я не знаю, как сделать то, что вы пытаетесь сделать, используя then() для фьючерсов — я не уверен, что это действительно возможно. Вы можете сделать это с помощью for или for-in, используя async/await вместо then(). (Я научился, когда мне нужны детерминированные итераторы в Dart, использовать регулярные циклы, такие как ваш второй цикл.) Если вы хотите попробовать async/await, здесь есть статья, в которой рассказывается об асинхронном программировании, циклах ввода и вывода.