Flutter显示已登录用户名称时提示‘Document does not exist’求助
解决Flutter中Firestore读取用户名称时的“Document does not exist”错误
问题情况
我在Flutter应用里尝试显示当前登录用户的名称,使用了以下代码,但一直出现“Document does not exist”的错误提示。代码取自一个技术社区提问,但原提问者未提供完整正确代码,特此求助。
原代码
class ProfilePage extends StatefulWidget { const ProfilePage({Key? key}) : super(key: key); @override State<ProfilePage> createState() => _ProfilePageState(); } class _ProfilePageState extends State<ProfilePage> { DocumentReference userName = FirebaseFirestore.instance .collection('users') .doc(FirebaseAuth.instance.currentUser!.uid); // 用于存储名称的变量 String name = ''; @override void initState() { super.initState(); userName.get().then((DocumentSnapshot ds) { name = ds['name']; }); } @override Widget build(BuildContext context) { return SingleChildScrollView( child: Column( children: <Widget>[ FutureBuilder<DocumentSnapshot>( future: userName.get(), builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) { if (snapshot.hasError) { return const Text("Something went wrong"); } if (snapshot.hasData && !snapshot.data!.exists) { return const Text("Document does not exist"); } if (snapshot.connectionState == ConnectionState.done) { Map<String, dynamic> data = snapshot.data!.data() as Map<String, dynamic>; return Text("Full Name: ${data['name']}"); } return const Text("loading"); }, ) ], ), ); } }
错误核心原因
出现该错误的关键问题:
- Firestore的
users集合中,不存在以当前登录用户UID为文档ID的文档; - 或者文档ID与
FirebaseAuth.instance.currentUser!.uid不匹配; - 用户注册时未将信息写入Firestore,导致文档缺失。
解决方案
1. 先确认Firestore数据结构
登录Firebase控制台进入Firestore面板:
- 检查
users集合下是否有以当前用户UID命名的文档; - 确认该文档内包含
name字段。
2. 修正代码(优化+修复潜在问题)
删除冗余的initState异步请求(FutureBuilder已处理数据获取),增加空安全和错误提示优化:
class ProfilePage extends StatefulWidget { const ProfilePage({Key? key}) : super(key: key); @override State<ProfilePage> createState() => _ProfilePageState(); } class _ProfilePageState extends State<ProfilePage> { @override Widget build(BuildContext context) { final currentUser = FirebaseAuth.instance.currentUser; // 处理用户未登录的情况 if (currentUser == null) { return const Center(child: Text("请先登录")); } final userDocRef = FirebaseFirestore.instance .collection('users') .doc(currentUser.uid); return SingleChildScrollView( child: Column( children: <Widget>[ FutureBuilder<DocumentSnapshot>( future: userDocRef.get(), builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) { if (snapshot.hasError) { return Text("加载出错: ${snapshot.error}"); } if (snapshot.connectionState == ConnectionState.waiting) { return const Text("加载中..."); } if (!snapshot.data!.exists) { return const Text("用户信息不存在,请检查Firestore数据"); } Map<String, dynamic> data = snapshot.data!.data() as Map<String, dynamic>; // 处理name字段为空的情况 return Text("全名: ${data['name'] ?? '未设置'}"); }, ) ], ), ); } }
3. 检查Firestore权限规则
确保当前登录用户有权限读取自己的文档,可在Firebase控制台设置如下规则:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; } } }
4. 确认用户注册流程
用户注册成功后,必须将用户信息写入Firestore,示例代码:
// 用户注册成功后调用 Future<void> createUserDocument(User user, String name) async { await FirebaseFirestore.instance .collection('users') .doc(user.uid) .set({ 'name': name, 'email': user.email, // 其他用户字段 }); }
内容的提问来源于stack exchange,提问作者FelyAnony
相关产品推荐
相关产品推荐

