dart 如何检查Firestore文档是否存在?

thtygnil  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(134)

我一直在获取一个帖子,在我的Forestore中,我有一个名为likes的集合,在这个集合中,我存储了所有用户电子邮件的文档。
所以我创建了一个StreamBuilder

StreamBuilder(
  stream: FirebaseFirestore.instance
      .collection("likes")
      .doc(FirebaseAuth
          .instance.currentUser!.email)
      .collection("liked")
      .doc(id)
      .snapshots(),
  builder: (context, snapshot) {
    bool liked = false;

    if (snapshot.hasData) {
      var col = FirebaseFirestore.instance
          .collection("likes");

      var doc = col.doc(FirebaseAuth
          .instance.currentUser!.email);

      var col2 = doc.collection("liked");

      var doc2 = col2.doc(id).get();

      if (doc2 == null) {
        liked = false;
      } else {
        liked = true;
      }
    }
    return Row(
      children: [
        // Text(snapshot.data.toString()),
        IconButton(
            onPressed: () {
              liked
                  ? FirebaseFirestore.instance
                      .collection("likes")
                      .doc(FirebaseAuth.instance
                          .currentUser!.email)
                      .delete()
                  : FirebaseFirestore.instance
                      .collection("likes")
                      .doc(FirebaseAuth.instance
                          .currentUser!.email)
                      .collection("liked")
                      .add({"like": true});
            },
            icon: GradientIcon(
              height: height,
              width: width,
              icon: liked
                  ? CupertinoIcons.heart_fill
                  : CupertinoIcons.heart,
              gradient: const LinearGradient(
                  begin: Alignment.bottomLeft,
                  end: Alignment.topRight,
                  colors: [
                    Colors.deepPurple,
                    Colors.deepPurpleAccent
                  ]),
            )),
      ],
    );
  }),

在上面的代码中,我试图检查用户是否喜欢特定的帖子并相应地更改UI.但我认为关键字exist已被弃用,因此每当我试图检查文档是否存在时,它总是返回true b/c快照总是有数据.
那么我如何通过使用文档ID来检查文档是否存在呢?

gt0wga4j

gt0wga4j1#

不知何故,你的代码首先将数据加载到一个`StreamBuilder中,但随后又回到数据库中再次加载相同的数据。
而不是使用以下命令从快照中获取数据:

StreamBuilder(
  stream: FirebaseFirestore.instance
      .collection("likes")
      .doc(FirebaseAuth
          .instance.currentUser!.email)
      .collection("liked")
      .doc(id)
      .snapshots(),
  builder: (context, asyncSnapshot) {
    bool liked = false;

    if (asyncSnapshot.hasData) {
      var docSnapshot = asyncSnapshot.data!;

      liked = !docSnapshot.exists;
    }
    ...

由于您的一些困惑可能来自所涉及的不同类型的快照,我建议您也阅读我对What is the difference between existing types of snapshots in Firebase?的回答。

相关问题