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

Flutter多for循环执行顺序异常问题及解决方案咨询

问题分析与解决方法

你的代码出现执行顺序错误,核心问题集中在变量冲突、数据累积和异步操作未同步这几点:

1. 变量重名导致逻辑混乱

内层循环for (var i in oldDatesDone)的变量名i和外层循环的索引变量i重名,直接覆盖了外层索引值,导致后续访问newactivities[i]时逻辑完全错误。

2. 全局/外层列表未清空,数据交叉污染

oldDatesDone、oldDatesNotDone、act如果是外层定义的变量,每次循环不会自动清空,上一次循环的数据会被带入下一次,导致计算结果偏差。

3. 异步操作未等待,更新顺序失控

Firestore的update是异步操作,外层同步循环不会等待更新完成就进入下一次循环,可能出现多次更新互相覆盖的情况。


修复后的完整代码

Future<void> changeWeek() async {
  // 提前计算当年第一个周一,避免每次循环重复计算
  int year = DateTime.now().year;
  DateTime startDate = DateTime(year, 1, 1);
  while (startDate.weekday != DateTime.monday) {
    startDate = startDate.add(const Duration(days: 1));
  }

  // 重置act列表(若为外层变量,必须清空后再循环)
  act.clear();

  for (int i = 0; i < newactivities.length; i++) {
    // 每次循环新建局部列表,彻底避免数据累积
    final List<Timestamp> oldDatesDone = [];
    final List<Timestamp> oldDatesNotDone = [];

    for (String weekday in newactivities[i].daylistdone) {
      int offset = (int.parse(weekday)) + (int.parse(currentweek) - 1) * 7;
      DateTime donedate = startDate.add(Duration(days: offset));
      oldDatesDone.add(Timestamp.fromDate(donedate));
    }

    for (String weekday in newactivities[i].daylist) {
      int offset = (int.parse(weekday) - 1) + (int.parse(currentweek) - 1) * 7;
      DateTime notdonedate = startDate.add(Duration(days: offset));
      oldDatesNotDone.add(Timestamp.fromDate(notdonedate));
    }

    // 修复变量名,避免和外层索引i冲突
    for (var date in oldDatesDone) {
      oldDatesNotDone.remove(date);
    }

    // 用扩展运算符合并列表,更安全清晰
    final finaloldDatesDone = [...newactivities[i].weekdaysdone, ...oldDatesDone];
    final finaloldDatesNotDone = [...newactivities[i].weekdaysnotdone, ...oldDatesNotDone];

    act.add({
      'title': newactivities[i].title,
      'days': newactivities[i].daylist,
      'notificationidnumber': newactivities[i].notificationidnumber,
      'daysdone': myData22,
      'weekdaysdone': finaloldDatesDone,
      'weekdaysnotdone': finaloldDatesNotDone,
      'timelist': newactivities[i].timelist,
      'time': newactivities[i].time
    });

    // 等待Firestore更新完成,确保循环顺序执行
    await FirebaseFirestore.instance
        .collection(widget.user.user.uid)
        .doc(documentName)
        .update({"activities": act});
  }
}

关键修改说明

  • 变量重名修复:将内层循环变量从i改为date,彻底避免覆盖外层索引。
  • 局部列表初始化:把oldDatesDone、oldDatesNotDone放在循环内部,每次循环创建新列表,保证数据独立。
  • 异步操作同步:将changeWeek改为async方法,用await等待Firestore更新完成,强制循环按顺序执行。
  • 性能优化:将startDate的计算提到循环外,减少重复计算。
  • 列表合并优化:使用扩展运算符...合并列表,比直接+更安全,避免修改原列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 13:40:33