firebase - 为什么文档不存在。但始终 !snapshot.hasData 都是 false

标签 firebase flutter dart google-cloud-firestore flutter-web

我制作注册系统并管理用户信息。

注册时,用户需要输入用户名,该用户名存储在firestore中。

用户数据是这样存储的;

Img

并尝试使用代码获取userName

CollectionReference users = FirebaseFirestore.instance.collection('users');

return FutureBuilder<DocumentSnapshot>(
  future: users.doc(FirebaseAuth.instance.currentUser!.uid).get(),
  builder:
      (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
    if (snapshot.hasError) {
      return Text("Something went wrong");
    }

    print("${!snapshot.hasData} ${!snapshot.data!.exists}"); // always "false true"
    if (!snapshot.hasData && !snapshot.data!.exists) {
      return Text("Document does not exist");
    }

    if (snapshot.connectionState == ConnectionState.done) {
      Map<String, dynamic> data =
          snapshot.data!.data() as Map<String, dynamic>;
      return Text("User Name: ${data['userName']}");
    }

    return const CircularProgressIndicator();
  },
);

但是总是调用return Text("Document does not exit");,并且不显示userName

为什么userName没有返回?我搜索了拼写错误,但找不到。 这个问题今天花了很多时间。谢谢。

最佳答案

snapshot.data您指的是 AsyncSnapshot用于监视异步操作的状态。它的hasData当异步操作完成时变为 true:因此当完成读取 DocumentSnapshot 时从数据库中。

检测是否DocumentSnapshot实际上存在,你需要检查它的 exists属性。

常见状态的快速摘要:

<表类=“s-表”> <标题> 对象.属性 值 解释 <正文> AsyncSnapshot.hasData false 异步操作尚未完成,或者未产生 DocumentSnapshot (例如:如果出现网络错误)。调用snapshot.data将导致错误消息。 AsyncSnapshot.hasData true 异步操作已完成,您可以放心调用snapshot.data就可以得到DocumentSnapshot . DocumentSnapshot.exists false 您请求的文档不存在,正在调用document.data快照上将导致错误。 DocumentSnapshot.exists true 您请求的文档存在,您可以访问其数据。

所以你的!snapshot.hasData一旦 AsyncSnapshot 将为 false已完成加载 DocumentSnapshot 。要确定文档是否确实存在,请使用 snapshot.hasData && snapshot.data!.exists .

我还建议您查看我对 Flutter 代码中各种类型快照的解释:What is the difference between existing types of snapshots in Firebase?

关于firebase - 为什么文档不存在。但始终 !snapshot.hasData 都是 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69300578/

相关文章:

android - E/FirebaseInstanceId : Token retrieval failed: AUTHENTICATION_FAILED - what changed?

javascript - 如何从客户端 React 应用程序使用 firebase 存储?

flutter - 在 Dart 中添加/减去迄今为止的月/年?

dart - 如何在类构造函数中为 Map 类型变量分配默认值?

dart - 如何使用 Dart 从浏览器发送多部分 HTTP 请求

azure - 使用 dio 时上传到 Azure 的文件已损坏

servicestack - Dart DateTime.parse() ServiceStack 返回的字符串日期

android - 在Firebase-Realtime Database上使用什么规则让用户注册和登录?

java - 无法从 Firebase 检索数据到 ListView

flutter - 我应该如何区分 Flutter 移动版和网页版应用程序?