如何汇总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
相关产品推荐
相关产品推荐

