Flutter接入Firestore无法展示用户名、doc属性未定义报错求助
问题修复方案
后端代码错误修复
你后端代码存在两个核心错误:
- 用
users.add()存数据会自动生成随机文档ID,没有绑定用户uid作为文档ID,后续users.doc(uid).get()无法匹配到对应文档 DocumentSnapshot类型本身自带data()方法,不需要额外调用.doc属性,这是报The getter 'doc' isn't defined for the type 'DocumentSnapshot<Object?>的直接原因
修复后后端代码:
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; // 修正返回值类型,适配返回的用户名 Future<String?> userSetup(String displayName) async { CollectionReference users = FirebaseFirestore.instance.collection('Users'); FirebaseAuth auth = FirebaseAuth.instance; String uid = auth.currentUser!.uid; // 本身为字符串类型,无需冗余toString // 改用doc(uid).set指定uid为文档ID,和后续查询逻辑匹配 await users.doc(uid).set({'displayName': displayName, 'uid' : uid }); final result = await users.doc(uid).get(); // 直接调用DocumentSnapshot的data()方法,去掉冗余的.doc return result.data()?['displayName']; }
前端代码错误修复
你前端代码存在三个核心错误:
- 集合名大小写不匹配:后端写入的集合是
Users(大写U开头),前端查询用的是users(小写u开头),Firestore集合名大小写敏感,无法匹配到数据 - 逻辑判断顺序倒置:修改后的代码中判断
snapshot.hasData就返回加载中,完全搞反了逻辑,hasData代表已经拿到查询结果 - 类型转换缺失:
snapshot.data默认是Object?类型,没有显式转换就直接用[]运算符取值会报错
修复后前端代码:
FutureBuilder<DocumentSnapshot>( // 集合名大小写和后端保持一致,为大写U开头的Users future: FirebaseFirestore.instance .collection('Users') .doc(FirebaseAuth.instance.currentUser!.uid) .get(), builder: (context, snapshot) { // 优先判断加载错误 if (snapshot.hasError) { return Text("加载出错: ${snapshot.error}"); } // 判断加载中状态 if (snapshot.connectionState == ConnectionState.waiting) { return Text("Loading..."); } // 加载完成后判断文档是否存在 if (!snapshot.hasData || !snapshot.data!.exists) { print('Document does not exist on the database'); return Text("未找到用户信息"); } // 显式转换类型后取值,适配空安全规则 Map<String, dynamic> userData = snapshot.data!.data() as Map<String, dynamic>; return Text(userData['displayName'] ?? "匿名用户"); }, )
内容的提问来源于stack exchange,提问作者kernelrpc_mach_vm_protect
相关产品推荐
相关产品推荐

