为啥文档不存在。但所有时间 !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.data
是AsyncSnapshot
,用于监控异步操作的状态。当异步操作完成时,它的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 && 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 控件不可见,但存在于文档指南中