为啥文档不存在。但所有时间 !snapshot.hasData 都是假的

Posted

技术标签:

【中文标题】为啥文档不存在。但所有时间 !snapshot.hasData 都是假的【英文标题】:Why document doesn't exist. But all time !snapshot.hasData is false为什么文档不存在。但所有时间 !snapshot.hasData 都是假的 【发布时间】:2021-11-16 21:15:56 【问题描述】:

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

注册时,用户需要填写用户名,并保存在firestore中。

用户数据是这样存储的;

并尝试使用代码获取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 exist");,而不显示userName

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

【问题讨论】:

【参考方案1】:

错过在snapshot.hasData之前使用!

if (!snapshot.hasData && !snapshot.data!.exists) 
      return Text("Document does not exist");
    

【讨论】:

谢谢。我试过了,这个if 语句被忽略了,但是快照真的是空的。 print("$!snapshot.hasData $!snapshot.data!.exists"); 结果是 false true。为什么我无法获取数据? 你的文档ID呢? 这是用户 uid。 doc() 等于 doc(FirebaseAuth.instance.currentUser!.uid) 所以我写了。【参考方案2】:

您所指的snapshot.dataAsyncSnapshot,用于监控异步操作的状态。当异步操作完成时,它的hasData 变为真:所以当它完成从数据库中读取DocumentSnapshot 时。

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

常见状态的快速总结:

Object.property Value Explanation
AsyncSnapshot.hasData false the asynchronous operation has either not yet completed, or did not result in a DocumentSnapshot (for example: if there was a network error). Calling snapshot.data will result in an error message.
AsyncSnapshot.hasData true the asynchronous operation has completed and you can safely call snapshot.data on it to get the DocumentSnapshot.
DocumentSnapshot.exists false the document you requested does not exist, and calling document.data on the snapshot will result in an error.
DocumentSnapshot.exists true the document you requested exists, and you can access its data.

因此,一旦 AsyncSnapshot 加载完 DocumentSnapshot,您的 !snapshot.hasData 就会为假。要确定文档是否实际存在,请使用snapshot.hasData &amp;&amp; snapshot.data!.exists

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

【讨论】:

非常感谢。但我还是不明白为什么DocumentSnapshot.exists 总是false。我一遍又一遍地检查拼写错误,它存在于 firestore 字段中。

以上是关于为啥文档不存在。但所有时间 !snapshot.hasData 都是假的的主要内容,如果未能解决你的问题,请参考以下文章

为啥当 min-height: 100% 时 HTML 和 BODY 不占用文档的所有可用高度? [复制]

为啥不支持来自其他设备的表情符号?

flexbox 表,所有 div 对齐但一个,边框不匹配,不知道为啥

ViewController 控件不可见,但存在于文档指南中

wpf中从windows中打开windows1但为啥不显示windows1中的控件

为啥存在 serialVersionUID 字段?