You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:23:22