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

如何在Flutter中从Firestore获取当前用户文档ID/名称?

解决Flutter中获取Firestore当前用户文档的问题

核心问题梳理

你的代码存在三个关键问题:

  • 获取firebaseUser的位置错误,await不能直接在函数外使用,必须放在async函数内部
  • User类的fromJson方法里,你取的是json['id'],但Firestore文档中存储的字段是uid,字段名不匹配
  • 未处理FirebaseAuth.instance.currentUser为null的情况(用户未登录时会返回null)

修正后的完整代码

1. 修正User类的fromJson方法

将字段取值改为和Firestore存储的uid对应:

class User {
  String uid;
  final String name;
  final int age;
  final String email;

  User({
    this.uid = '',
    required this.name,
    required this.age,
    required this.email,
  });

  Map<String, dynamic> toJson() => {
        'uid': uid,
        'name': name,
        'age': age,
        'email': email,
      };

  static User fromJson(Map<String, dynamic> json) => User(
        uid: json['uid'], // 改为匹配Firestore的字段名
        name: json['name'],
        age: json['age'],
        email: json['email'],
      );
}

2. 修正readUser函数

把获取当前用户的逻辑移到async函数内部,同时处理未登录场景:

Future<User?> readUser() async {
  // 获取当前登录用户
  final firebaseUser = FirebaseAuth.instance.currentUser;
  
  // 用户未登录时直接返回null
  if (firebaseUser == null) {
    print('用户未登录');
    return null;
  }

  // 根据当前用户uid获取Firestore文档
  final docUser = FirebaseFirestore.instance.collection('users').doc(firebaseUser.uid);
  final snapshot = await docUser.get();

  if (snapshot.exists) {
    return User.fromJson(snapshot.data()!);
  } else {
    print('用户文档不存在');
    return null;
  }
}

额外说明

从你提供的Firestore数据截图来看,users集合下的文档ID和文档内的uid字段完全一致,所以用firebaseUser.uid作为文档ID的逻辑是正确的,直接匹配即可。

内容的提问来源于stack exchange,提问作者arief ariefshamsuddin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:20:22