未来的 For 循环中的 Int 不会增加 Flutter/Firestore
Posted
技术标签:
【中文标题】未来的 For 循环中的 Int 不会增加 Flutter/Firestore【英文标题】:Int in a For loop inside future not incrementing Flutter/Firestore 【发布时间】:2021-11-11 16:05:25 【问题描述】:我正在尝试使用 for 循环设置许多 Firestore 文档,并使用递增变量,但这个变量不像它那样递增... 这是代码
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
)
,
事实是变量首次亮相Rdv 并没有像我想要的那样递增。它在第二个循环 (createCreneau) 中正确递增,但在第一个循环 (createRdv) 中不正确。这就像函数 createRdv 在运行“then”之前运行的次数与我的列表 prestaSelected 的长度一样多...... 我真的不明白发生了什么。
例如结果应该是:
*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*
请帮忙。
【问题讨论】:
只是一个建议:我发现 async/await 语法比 'then' 语法更容易调试和阅读。我建议进行此更改,因为您使用 For 循环嵌套了 Futures,这将很快变得复杂。 【参考方案1】:问题:您的第一个 for-in 语句不会等待 rdvService.createRdv().then() 在移动到下一个项目之前完成,这会导致不确定(不可预测) 函数的执行顺序。
我不知道如何使用 then() 来做你想做的事情——我不确定它是否真的可能。您可以使用 async/await 而不是 then() 使用 for 或 for-in 来完成。 (当我需要 Dart 中的确定性迭代器以使用常规 for 循环(如第二个循环)时,我了解到。)如果您想尝试 async/await,有一个 article here 涵盖异步编程以及 for-in 和 forEach 循环。
【讨论】:
以上是关于未来的 For 循环中的 Int 不会增加 Flutter/Firestore的主要内容,如果未能解决你的问题,请参考以下文章
For-Each循环Java错误ArrayIndexOutOfBoundsException