嵌套Async Await递归函数无法正确统计Firestore成员总数
问题描述
我有一个Firestore数据结构,需要统计某用户下所有已注册成员的总数。但当前使用的递归Async Await函数仅能统计初始数组的数量,附上Dart代码如下,希望获取能正确统计所有成员数的递归函数实现。
Future<int> getalldata(String docref) async { int count = 0, abhj = 0; DocumentReference docRef = FirebaseFirestore.instance.collection('memberships').doc(docref); DocumentSnapshot value = await docRef.get(); print(value.data().toString()); if (value.data().toString().contains('referredto:')) { print("CHala"); if (value.get('referredto').length > 0) { print(value.get('referredto').length); for (dynamic i in value.get('referredto')) { count += await getalldata(i.id.toString()); } //print('its empty' + value.get('referredto')[0].id.toString()) } else { count = await count + 1; print('ye b1'); } } else { count = await count + 1; print('ye b'); } print("count>>" + count.toString()); return await count; }
问题分析
原代码的核心问题:
- 通过
value.data().toString().contains('referredto:')判断字段存在性极不可靠,数据结构的toString输出格式变化就会导致判断失效 - 当文档存在
referredto数组时,仅累加子节点的数量,没有把当前用户本身计入总数,导致统计结果缺失当前节点
修正后的递归函数实现
Future<int> getTotalMembers(String docId) async { // 先计入当前用户本身 int count = 1; final docRef = FirebaseFirestore.instance.collection('memberships').doc(docId); final docSnapshot = await docRef.get(); if (!docSnapshot.exists) { // 如果文档不存在,返回0(避免无效统计) return 0; } final data = docSnapshot.data(); // 安全判断referredto字段是否存在且为非空数组 if (data != null && data.containsKey('referredto') && data['referredto'] is List && data['referredto'].isNotEmpty) { final referredList = data['referredto'] as List; // 遍历所有子节点ID,递归统计并累加 for (final referredDoc in referredList) { // 确保每个元素有id属性(对应Firestore文档引用) if (referredDoc.id != null) { count += await getTotalMembers(referredDoc.id.toString()); } } } print("当前节点 ${docId} 的累计总数:$count"); return count; }
关键修改说明
- 初始计数设为1:无论当前节点有没有子成员,先把自身计入总数
- 安全的字段判断:通过
data?.containsKey('referredto')和类型检查替代字符串匹配,避免误判 - 空文档处理:增加文档不存在的判断,返回0避免错误累加
- 子节点合法性检查:遍历子节点时验证
id存在,防止无效引用导致异常
内容的提问来源于stack exchange,提问作者Neetish Singh
相关产品推荐
相关产品推荐

