在 Flutter/Dart 中,使用 Firebase Firestore,当使用 DocumentSnapshot 对象流设置 StreamBuilder 时,如下所示:
@override
Widget build(BuildContext context) {
return StreamBuilder<DocumentSnapshot>(
stream: FirebaseFirestore.instance
.collection('user_account_status')
.doc(userId)
.snapshots(),
builder: (context, snapshot) { ... }
假设我们想要在该位置不存在任何文档的情况下推断一些事实。
如果我们希望能够(在代码中)明确地得出结论:该位置不存在任何文档——也就是说,不要由于网络状态、Firestore 规则因配置错误而拒绝权限等其他问题而出现误报...
那么 { ... } 中应该有什么控制流?
如果我理解正确的话,
如果还没有实际的流,则 ConnectionState 将为 .waiting 并且 snapshot.hasData 将为 false,因为 snapshot.hasData 并不引用 firestore 中包含的实际数据,而是引用快照本身 - 无论是否是流事件已发出。
如果出现错误(包括 firestore 规则问题),则 snapshot.hasError 将为 true。
那么,这是否意味着只要我们能够排除这些情况,我们就可以检查 snapshot.data.exists 并且可以相信结果?
除非我误解了这个问题,否则这可以通过相当简单的方式完成:
Widget build(BuildContext context) {
return StreamBuilder<DocumentSnapshot>(
stream: FirebaseFirestore.instance
.collection('user_account_status')
.doc(userId)
.snapshots(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator(); // Show a loading indicator while waiting for data
}
if (snapshot.hasError) {
return Text('Error: ${snapshot.error}'); // Handle any errors that occur during the stream
}
// **ATTN** this is the case you are specifically interested in
if (!snapshot.hasData || !snapshot.data!.exists) {
return Text('Document does not exist'); // Document does not exist
}
// If the document exists, access it here
var documentData = snapshot.data!.data() as Map<String, dynamic>;
return Text('Document exists with data: $documentData');
},
);
}
您还可以调整此代码以完全满足您的需要 - 它处理所有(?)可能的情况,包括有线连接。