Flutter中如何在Firestore的.doc()方法中使用当前用户UID获取数据
解决方案
问题根源
- 集合名称大小写不匹配:你写入用户数据时用的集合名是
Users(首字母大写),但查询时用的是users(全小写),Firestore集合名称大小写敏感,会直接导致查不到对应文档 - UID获取逻辑和Firestore查询逻辑没有做异步串联:你封装的
inputData是异步方法,没有等它返回UID就直接查询Firestore,自然拿不到有效uid参数 - 后续更新的代码中FutureBuilder逻辑顺序错误:先判断
snapshot.hasData就直接返回加载状态,后续取值逻辑完全无法执行
修正代码
方案1:复用Provider封装的inputData方法(推荐,避免强制解包风险)
两层FutureBuilder嵌套,先获取UID再查询用户数据:
// 先获取你的AuthProvider实例,根据你实际的Provider类型调整 final authProvider = Provider.of<AuthProvider>(context, listen: false); return FutureBuilder<String>( future: authProvider.inputData(), builder: (context, uidSnapshot) { // 还在获取UID if (uidSnapshot.connectionState != ConnectionState.done) { return const Text("加载中..."); } // 拿到UID后查询Firestore final uid = uidSnapshot.data!; return FutureBuilder<DocumentSnapshot>( future: FirebaseFirestore.instance .collection('Users') // 这里要和写入时的集合名一致,首字母大写 .doc(uid) .get(), builder: (context, userSnapshot) { if (userSnapshot.connectionState == ConnectionState.waiting) { return const Text("加载中..."); } if (userSnapshot.hasError) { return const Text("加载失败"); } if (!userSnapshot.hasData || !userSnapshot.data!.exists) { print('数据库中不存在对应文档'); return const Text("未找到用户信息"); } // 拿到用户数据返回 Map<String, dynamic> userData = userSnapshot.data!.data() as Map<String, dynamic>; return Text(userData['displayName']); }, ); }, );
方案2:直接使用FirebaseAuth currentUser(需保证用户已登录)
如果你确认页面渲染时用户一定已登录,可以简化为单层FutureBuilder,同时修正原逻辑错误:
return FutureBuilder<DocumentSnapshot>( future: FirebaseFirestore.instance .collection('Users') // 修正集合名大小写 .doc(FirebaseAuth.instance.currentUser!.uid) .get(), builder: (context, snapshot) { // 优先判断加载状态 if (snapshot.connectionState == ConnectionState.waiting) { return const Text("加载中..."); } // 判断错误 if (snapshot.hasError) { return const Text("加载失败"); } // 判断文档是否存在 if (!snapshot.hasData || !snapshot.data!.exists) { print('数据库中不存在对应文档'); return const Text("未找到用户信息"); } // 正常返回昵称 Map<String, dynamic> userData = snapshot.data!.data() as Map<String, dynamic>; return Text(userData['displayName']); }, );
参考截图
你上传的Firestore文档结构如下,可确认集合名确实为首字母大写的Users:
内容的提问来源于stack exchange,提问作者kernelrpc_mach_vm_protect
相关产品推荐
相关产品推荐

