Flutter中如何读取Firestore的字段值?
问题分析与修正
你的代码存在几个关键问题导致输出不符合预期:
- 查询条件错误:当前
where("number", isEqualTo: true)是筛选number字段等于布尔值true的文档,和你要获取所有文档number字段的需求不符;如果是要匹配传入的number参数,也应该写成isEqualTo: number。 await与then混用:同时使用这两种异步处理方式会导致documentSnapshot接收的是then回调的返回值(你这里没返回内容,所以是null),无法正确拿到查询结果。- 变量名冲突:
then回调里重新定义了number变量,覆盖了函数的入参,容易引发逻辑混乱。
修正方案1:获取所有文档的number字段值
如果你的需求是加载users集合下所有文档的number字段,直接去掉where条件即可:
void _checkNumber(String number) async { final userRef = firestore.collection('users'); // 直接获取集合下所有文档 final querySnapshot = await userRef.get(); // 遍历所有文档,提取number字段 final List<dynamic> allNumbers = querySnapshot.docs.map((doc) { return doc.data()['number']; }).toList(); print('所有文档的number字段值:$allNumbers'); }
修正方案2:匹配传入的number参数(如果是这个需求)
如果你的实际需求是查找number字段等于传入参数的文档,再提取其number字段,修正后的代码如下:
void _checkNumber(String number) async { final userRef = firestore.collection('users'); // 使用传入的number作为查询条件 final querySnapshot = await userRef.where("number", isEqualTo: number).get(); if (querySnapshot.docs.isNotEmpty) { // 提取匹配文档的number字段 final matchedNumbers = querySnapshot.docs.map((doc) => doc.data()['number']).toList(); print('匹配的number字段值:$matchedNumbers'); } else { print('没有找到匹配的文档'); } }
关键说明
- 避免
await和then混用,保持异步代码风格统一,新手更适合用await的同步写法。 - 注意字段名和函数名拼写(你的函数名写成了
_checkNumner,少了一个b,建议修正为_checkNumber)。
内容的提问来源于stack exchange,提问作者Hoon
相关产品推荐
相关产品推荐

