Flutter中Firebase Firestore无法获取当前登录用户数据求助
问题分析与解决方案
核心问题在于:你通过FirebaseAuth.instance.currentUser!.uid作为文档ID查询单条用户数据,但你的Firestore用户文档并未使用用户UID作为文档ID存储——从你打印的全量用户数据能看到,你只输出了文档的字段内容,没有包含文档ID,而实际存储时大概率用了Firestore自动生成的随机ID,而非用户UID。
第一步:验证文档ID与用户UID是否匹配
修改获取全量用户数据的代码,把每个文档的ID也打印出来,直接对比是否和当前用户UID一致:
final allUsersSnapshot = await FirebaseFirestore.instance.collection('utenti').get(); final allUsersData = allUsersSnapshot.docs.map((doc) => { "doc_id": doc.id, // 新增打印文档ID ...doc.data() }).toList(); print('Dati di tutti gli utenti: $allUsersData');
运行后查看控制台输出的doc_id,和FirebaseAuth.instance.currentUser!.uid对比,就能确认两者是否不匹配。
第二步:两种解决思路
思路1:修改存储逻辑,用用户UID作为文档ID
这是更规范的做法,后续查询直接通过UID定位文档,逻辑更清晰。创建用户数据时改成:
final currentUser = FirebaseAuth.instance.currentUser; if (currentUser != null) { await FirebaseFirestore.instance.collection('utenti') .doc(currentUser.uid) // 用UID作为文档ID .set({ "Nome": "xxx", "Cognome": "xxx", "email": currentUser.email, "Indirizzo": "xxx" }); }
修改后,你原有的单条数据查询代码就能正常工作。
思路2:通过唯一字段查询(不修改存储逻辑)
如果不想调整存储方式,就通过用户的唯一标识字段(比如email)查询文档,替换原有的单条查询逻辑:
Future<void> ProfileData() async { final currentUser = FirebaseAuth.instance.currentUser; if (currentUser == null) { print('Nessun utente autenticato.'); return; } // 通过email查询当前用户文档 FirebaseFirestore.instance.collection('utenti') .where('email', isEqualTo: currentUser.email) .snapshots() .listen((QuerySnapshot snapshot) { if (snapshot.docs.isNotEmpty) { Map<String, dynamic> data = snapshot.docs.first.data() as Map<String, dynamic>; setState(() { Nome = data["Nome"]; Cognome = data["Cognome"]; Indirizzo = data["Indirizzo"]; Email = data["email"]; }); } else { print('Nessun documento trovato per l\'utente corrente.'); } }); // 全量用户查询代码(已添加文档ID打印) final allUsersSnapshot = await FirebaseFirestore.instance.collection('utenti').get(); final allUsersData = allUsersSnapshot.docs.map((doc) => { "doc_id": doc.id, ...doc.data() }).toList(); print('Dati di tutti gli utenti: $allUsersData'); }
注意:使用where查询时,Firebase会提示你需要给email字段创建索引,按照控制台的提示链接创建即可,否则会出现查询失败的情况。
额外提示
避免直接用!强制解包currentUser,增加空判断可以避免未登录时的空指针异常,让代码更健壮。
内容的提问来源于stack exchange,提问作者sams
相关产品推荐
相关产品推荐

