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

Flutter中For循环添加暂停后执行顺序异常问题求助

问题:异步循环执行顺序混乱的解决方案

问题根源

你的choixJoueur函数放在build方法中,每次调用setState都会触发build重新执行,进而再次调用这个异步函数。多个异步循环同时运行,它们的Future.delayed任务会交错执行,导致输出顺序完全混乱。另外,sleep会阻塞Flutter主线程,直接导致UI卡死直到循环结束;Timer方案同样会因为多次触发并行任务,出现相同的乱序问题。

解决步骤

  1. 添加运行状态标志:用一个布尔变量标记当前是否正在执行选择逻辑,避免重复触发多个异步循环。
  2. 复用Random实例:不要在每次循环里新建Random对象,复用一个实例能保证随机数生成的稳定性,也更高效。
  3. 避免在build中直接调用异步函数:将函数触发逻辑移到initState(仅初始化时执行)或者用户交互事件(比如按钮点击)中,防止build重复调用。

修改后的代码示例

bool _isSelecting = false;
final Random _random = Random();

void choixJoueur() async {
  // 如果正在执行,直接返回,避免重复触发
  if (_isSelecting) return;
  _isSelecting = true;

  for(int i = 1; i<=50; i++){
    await Future.delayed(const Duration(milliseconds: 500));
    
    int j1=0;
    int j2=0;
    print("iteration : ${i}");
    
    // 复用同一个Random实例
    while(j1 == j2){
      j1 = _random.nextInt(joueurs.length);
      j2 = _random.nextInt(joueurs.length);
      print(j1);
      print(j2);
    }
    
    setState(() {
      joueurDuel1 = joueurs[j1];
      joueurDuel2 = joueurs[j2];
    });
  }
  
  // 循环结束后重置标志
  _isSelecting = false;
}

// 初始化时调用,或者通过按钮触发
@override
void initState() {
  super.initState();
  // 这里可以选择是否在初始化时自动执行
  // WidgetsBinding.instance.addPostFrameCallback((_) => choixJoueur());
}

额外说明

  • 如果需要用户手动触发选择逻辑,可以给按钮添加onPressed: choixJoueur,这样只会在用户点击时执行一次循环,不会出现重复触发的问题。
  • 复用Random实例是因为每次新建Random会使用当前时间作为种子,短时间内多次创建可能导致生成的随机数重复率高,影响选择逻辑的随机性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:52:33