我制作注册系统并管理用户信息。
注册时,用户需要输入用户名,该用户名存储在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 exit");
,并且不显示userName
。
为什么userName
没有返回?我搜索了拼写错误,但找不到。
这个问题今天花了很多时间。谢谢。
最佳答案
snapshot.data
您指的是 AsyncSnapshot
用于监视异步操作的状态。它的hasData
当异步操作完成时变为 true:因此当完成读取 DocumentSnapshot
时从数据库中。
检测是否DocumentSnapshot
实际上存在,你需要检查它的 exists
属性。
常见状态的快速摘要:
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/