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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 07:15:36