Flutter使用Firebase获取当前用户名遇两类报错,寻求解决方法
解决Firebase获取用户名称的问题
先修正第二段代码的错误
你第二段代码里的doc.get()是冗余操作——doc本身就是调用.get()后返回的DocumentSnapshot对象,不需要再次调用get(),这正是报错的原因。
完整修正后的代码
Future<void> getUserData() async { User? user = FirebaseAuth.instance.currentUser; // currentUser是同步属性,无需await if (user == null) { print("用户未登录"); return; } try { final DocumentSnapshot doc = await FirebaseFirestore.instance .collection("UserData") .doc(user.uid) .get(); if (!doc.exists) { print("UserData集合中无当前用户的文档"); return; } final data = doc.data() as Map<String, dynamic>?; if (data == null || !data.containsKey('name')) { print("用户文档中不存在'name'字段"); return; } name = data['name']; print("name $name"); } catch (e) { print("获取用户数据失败: ${e.toString()}"); } }
关键修复说明
- 移除冗余的
doc.get()操作,直接使用已获取的DocumentSnapshot - 增加用户登录状态检查,避免空安全风险(无需强制解包
user!.uid) - 增加文档存在性判断,提前处理无用户文档的情况
- 增加字段存在性校验,避免因缺少
name字段触发错误 - 修正
currentUser调用:FirebaseAuth.instance.currentUser是同步属性,不需要await
第一个错误的根源及解决
你第一次遇到的Bad state: cannot get a field on a DocumentSnapshotPlatform which does not exist,本质是两种情况之一:
UserData集合中没有当前用户UID对应的文档- 用户文档存在,但缺少
name字段
上面的代码会分别对这两种情况进行判断并打印提示,方便你快速排查问题。
内容的提问来源于stack exchange,提问作者Zephys
相关产品推荐
相关产品推荐

