Flutter从Firestore获取用户数据报错Receiver null,请求排查
问题分析与修复方案
核心错误原因
你遇到的「Receiver null」错误根源在于按钮点击逻辑的代码问题:
final LEO = await db .collection("EMPLOYEES") .where("First name", isEqualTo: "leonard") .get() .then( (res) => print("Successfully completed"), onError: (e) => print("Error completing: $e"), ); print("${LEO.First_name}");
- 同时使用
await和then时,then的返回值会覆盖await原本要获取的QuerySnapshot。这里then里执行的print返回void,导致LEO变量实际为null,后续访问LEO.First_name直接触发空指针错误。 - 即便拿到正确的
QuerySnapshot,也不能直接访问.First_name——查询返回的是文档列表(docs数组),需要从具体文档中提取数据。
冗余代码问题
你的Highiest_Education StatefulWidget里有一段无意义的构造函数代码,它不仅没有实际作用,还会抛出UnimplementedError,可能干扰组件初始化,建议直接删除:
late final FirebaseFirestore db; FirestoreSnippets(db) { // TODO: implement FirestoreSnippets throw UnimplementedError(); }
修复后的关键代码
将按钮的onPressed逻辑修改为:
onPressed: () async { try { final querySnapshot = await db .collection("EMPLOYEES") .where("First name", isEqualTo: "leonard") .get(); if (querySnapshot.docs.isNotEmpty) { // 获取第一个匹配的文档数据 final userData = querySnapshot.docs.first.data() as Map<String, dynamic>; print(userData["First name"]); // 确保字段名与Firestore中完全一致 } else { print("未找到匹配的用户"); } } catch (e) { print("查询出错: $e"); } },
补充说明
- 确认Firestore中的集合名
EMPLOYEES、字段名First name与代码中的拼写、大小写、空格完全一致。 - 使用
try-catch替代then的错误回调,逻辑更线性,也更便于调试。
内容的提问来源于stack exchange,提问作者Leonard Kabasa
相关产品推荐
相关产品推荐

