Flutter中如何通过Future循环查询Firestore文档的指定字段
Firestore 遍历读取文档字段解决方案
错误原因
- 代码中拿到的
element是QueryDocumentSnapshot文档快照实例,并非文档存储的字段数据,直接打印只会输出实例信息,也无法直接通过[]读取字段值 - 读取字段前需要先调用快照实例的
data()方法,获取到Map<String, dynamic>格式的文档数据后再操作对应字段
修正后代码
基础遍历版本
final querySnapshot = await FirebaseFirestore.instance .collection('userPhones') .doc(auth.currentUser!.uid) .collection("phoneNumbers") .get(); List<String> list = []; // 所有文档快照已经在get完成后同步返回,不需要用Future.forEach异步遍历 for (var docSnapshot in querySnapshot.docs) { final docData = docSnapshot.data(); final phoneNumber = docData['number'] as String; list.add(phoneNumber); print(docData); // 输出完整的文档字段键值对 }
简化写法
直接通过map转换快照列表得到手机号集合:
final querySnapshot = await FirebaseFirestore.instance .collection('userPhones') .doc(auth.currentUser!.uid) .collection("phoneNumbers") .get(); final List<String> list = querySnapshot.docs .map((docSnapshot) => docSnapshot.data()['number'] as String) .toList();
空安全优化建议
如果不能保证所有文档都存在number字段,建议添加空判断避免类型转换异常:
final List<String> list = querySnapshot.docs .map((docSnapshot) => docSnapshot.data()['number'] as String?) .whereType<String>() // 过滤掉空值 .toList();
内容的提问来源于stack exchange,提问作者Ini Hood
相关产品推荐
相关产品推荐

