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

如何汇总discounts集合折扣并计算学生总折扣,代码返回空列表原因排查

问题原因分析
  • 变量覆盖问题:你声明的snapshot2在循环遍历学生的过程中,每次都会被新的查询结果覆盖,之前学生的查询结果会直接丢失。如果allCourseStudents为空,或者最后一个学生没有符合条件的折扣记录,最终的allDiscountForAllStudents自然是空列表。如果allCourseStudents长度为0,循环根本不会执行,未初始化的snapshot2调用方法还会直接抛出异常。
  • 列表未累加:你没有在每次查询到单个学生的折扣记录时把结果添加到总列表里,而是等到循环结束后才把最后一次的snapshot2结果转成列表,前面所有学生的折扣数据都没有被收集。
  • 总折扣变量未更新:你初始化的_allDiscountForAllStudents全程没有被赋值,即使后续逻辑正常,返回值也永远是0,无法得到总折扣金额。
修正后代码
getAllDiscountForAllStudents() async {
    int _allDiscountForAllStudents = 0;
    QuerySnapshot querySnapshot = await FirebaseFirestore.instance
        .collection('courses')
        .doc(_id2)
        .collection('course_students')
        .where('withdraw', isEqualTo: false)
        .get();
    List allCourseStudents = querySnapshot.docs.toList();
    // 提前初始化折扣列表,避免无数据时报错
    List allDiscountForAllStudents = [];

    for (int i = 0; i < allCourseStudents.length; i++) {
      QuerySnapshot snapshot2 = await FirebaseFirestore.instance
          .collection('discounts')
          .where('Course Id', isEqualTo: _id2)
          .where('User Id', isEqualTo: allCourseStudents[i]['ID'])
          .where('Approved', isEqualTo: true)
          .get();
      // 把当前学生的折扣记录添加到总列表中
      allDiscountForAllStudents.addAll(snapshot2.docs);
    }

    // 累加所有折扣值,可根据你实际的折扣字段名修改下方的'discount'参数
    for (var discountDoc in allDiscountForAllStudents) {
      _allDiscountForAllStudents += (discountDoc['discount'] as int);
    }

    print(allDiscountForAllStudents);
    return _allDiscountForAllStudents;
  }

如果学生数量较多,你还可以用Future.wait把串行查询改成并行查询,提升接口响应速度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:24:03