Flutter Firebase如何单次非实时读取单个文档及修复get报错
Flutter Firebase 单次读取匹配登录用户UID的单文档实现及报错修复
报错根因
你遇到的三个报错均来自语法写法错误,同时代码还存在异步逻辑漏洞:
usersCollection.doc(uid)是同步返回DocumentReference对象的方法,不需要加await关键字document.get() => then(...)属于箭头函数语法误用:then是Future的实例方法,需要用.运算符调用;读取文档字段需使用方括号[]操作符,误用圆括号()会被识别为方法调用,因此触发The getter '(' isn't defined报错- 异步回调未做等待就执行return,会导致方法永远返回初始的空字符串,拿不到实际请求结果
正确实现代码
Firestore 提供的get()方法本身就是单次拉取数据的接口,不会建立实时监听,完全匹配非实时读取的需求,修复后完整代码如下:
class DatabaseService { final CollectionReference usersCollection = FirebaseFirestore.instance.collection("users"); final String uid; DatabaseService(this.uid); Future<String> getUserName() async { // 同步获取对应当前登录用户uid的文档引用 DocumentReference userDocRef = usersCollection.doc(uid); // 等待单次读取请求完成,拿到文档快照 DocumentSnapshot docSnapshot = await userDocRef.get(); // 增加文档存在性判断,避免文档不存在时抛出空指针错误 if (docSnapshot.exists) { Map<String, dynamic> userData = docSnapshot.data() as Map<String, dynamic>; // 读取name字段,字段不存在时返回空字符串 return userData['name'] ?? ''; } return ''; } }
调用示例
该方法是异步方法,调用时需要等待结果返回:
// 从Firebase Authentication获取当前登录用户的uid final String currentUserUid = FirebaseAuth.instance.currentUser!.uid; final DatabaseService dbService = DatabaseService(currentUserUid); // 等待异步请求完成拿到用户名 final String userName = await dbService.getUserName();
关键说明
- 不要混淆单次读取和实时监听:
get()仅拉取一次调用时刻的文档数据,snapshots()才会返回持续推送数据变更的流 - 从文档快照取值时,必须先通过
data()方法获取存储的Map结构数据,再通过[字段名]的方式取对应值,不能直接对快照对象加圆括号传字段名 - 在async函数内统一使用
await处理异步逻辑,避免嵌套then回调导致的逻辑时序问题,代码可读性更高
内容的提问来源于stack exchange,提问作者William Doyle
相关产品推荐
相关产品推荐

