如何在Flutter中使用StreamBuilder准确判断Firestore文档是否不存在?

问题描述 投票:0回答:1

在 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 并且可以相信结果?

flutter firebase dart google-cloud-firestore flutter-streambuilder
1个回答
0
投票

除非我误解了这个问题,否则这可以通过相当简单的方式完成:

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');
    },
  );
}

您还可以调整此代码以完全满足您的需要 - 它处理所有(?)可能的情况,包括有线连接。

© www.soinside.com 2019 - 2024. All rights reserved.