Flutter 暂停 For 循环

Flutter pause a For loop

提问人:Bernard 提问时间:6/5/2023 最后编辑:Ahmad FBernard 更新时间:6/14/2023 访问量:49

问:

我想编写一个带有 For 循环的函数来随机选择玩家。 我的功能如下,并且工作得很好:

void choixJoueur() {
    for(int i = 1; i<=50; i++){
        int j1=0;
        int j2=0;
        print("iteration : ${i}");
        while(j1 == j2){
          j1 = Random().nextInt(joueurs.length);
          j2 = Random().nextInt(joueurs.length);
          print(j1);
          print(j2);
        }
        setState(() {
          joueurDuel1 = joueurs[j1];
          joueurDuel2 = joueurs[j2];
        });
    }
  }

但是我想添加一个暂停以允许动画可见(该函数在构建方法中)。 我用 Future.delayed 转换了上面的函数,如下所示:

void choixJoueur() async {
    for(int i = 1; i<=50; i++){
      await Future.delayed(Duration(milliseconds: 500));
        int j1=0;
        int j2=0;
        print("iteration : ${i}");
        while(j1 == j2){
          j1 = Random().nextInt(joueurs.length);
          j2 = Random().nextInt(joueurs.length);
          print(j1);
          print(j2);
        }
        setState(() {
          joueurDuel1 = joueurs[j1];
          joueurDuel2 = joueurs[j2];
        });
    }
  }

结果很奇怪。摘录如下:

flutter: iteration : 10
flutter: 2
flutter: 2
flutter: 1
flutter: iteration : 1
flutter: 0
flutter: 1
flutter: iteration : 11
flutter: 3
flutter: 0
flutter: iteration : 2
flutter: 0
flutter: 0
flutter: 2
flutter: 3
flutter: iteration : 3

我尝试了几种方法:

  • sleep -> 直到循环结束才显示页面
  • 计时器 - >与Future.delayed
Flutter Loops 飞镖 延迟 暂停

评论

0赞 Ahmad F 6/5/2023
那么,为什么不在延迟之后调用,而不是将其添加到方法本身中呢?每次迭代都需要延迟吗?choixJoueur()
0赞 Bernard 6/5/2023
是的,我需要每次迭代的延迟。谢谢
0赞 jamesdlin 6/6/2023
在我看来,你所观察到的是两个重叠的执行。choixJoueur
0赞 Bernard 6/6/2023
事实上。。。函数 choixJoueur() 在 build 方法中被调用。我认为函数中的setStates会强制执行新的构建,从而触发对函数的新调用。当没有延迟时,它似乎不会引起任何问题,但是当我插入 Future.delayed 时,混乱就开始了。我尝试使用计时器,结果相同。

答:

0赞 Bernard 6/14/2023 #1

我找到了解决方案! 我必须有效地使用

await Future.delayed(Duration(milliseconds: 500));

但它必须放在 init 中,而不是放在构建中。如果放置在构建中,它会造成混乱。