如何在颤振中使用计数器?

时间:2021-05-05 12:45:16

标签: firebase flutter dart google-cloud-firestore

我正在尝试在我的应用程序中使用计数器来保存喜欢的内容。 这是我目前的代码

likevideo(String id, double _rating, String uidofuploadeduser) async {
    String uid = FirebaseAuth.instance.currentUser.uid;

    DocumentSnapshot doc =
        await FirebaseFirestore.instance.collection('videos').doc(id).get();
    if (!doc.data()['likes'].contains(uid)) {
      FirebaseFirestore.instance.collection('videos').doc(id).update({
        'likes': FieldValue.arrayUnion([uid]),
      });

      FirebaseFirestore.instance
          .collection('videos')
          .doc(id)
          .collection("uservotes")
          .doc(uid)
          .set({
        'rating': _rating,
        
        
      });
    }
  }
  

如您所见,我首先检查用户是否不存在于数组中,在这种情况下我让他喜欢,如果他已经存在于数组中,我让他不喜欢。这就是我的方法

  dislike(String id, double _rating) async {
    String uid = FirebaseAuth.instance.currentUser.uid;
    DocumentSnapshot doc =
        await FirebaseFirestore.instance.collection('videos').doc(id).get();
    if (doc.data()['likes'].contains(uid)) {
      FirebaseFirestore.instance.collection('videos').doc(id).update({
        'likes': FieldValue.arrayRemove([uid]),
      });
      FirebaseFirestore.instance
          .collection('videos')
          .doc(id)
          .collection("uservotes")
          .doc(uid)
          .delete();
    }

所以问题是我经常需要数组的长度,因此我想使用计数器函数而不是总是读取每个文档,但实际上不知道该怎么做。所以希望任何人都可以提供帮助。如果您需要更多信息,请发表评论。

这里以我使用它为例

Icon(
                                                  Icons.star,
                                                  size: 37,
                                                  color: FirebaseFirestore
                                                              .instance
                                                              .collection(
                                                                  "videos")
                                                              .doc(videos
                                                                  .data()['id'])
                                                              .collection(
                                                                  "uservotes")
                                                              .doc(uid)!=
                                                          null
                                                      ? Colors.yellow
                                                      : Colors.white,
                                                ),

Ant 目前列表是空的,所以没有用户投票,但星星是黄色的

1 个答案:

答案 0 :(得分:0)

我建议使用云功能来做到这一点。否则,您将让每个人都可以更改喜欢的总数;) 当有人添加或删除喜欢时,只需设置一个 firestore 触发器。我还建议将每个喜欢存储为集合文档而不是数组,因为正如您提到的,您需要整个数组(所有喜欢)来检查是否有人喜欢某事。如果您将它存储在 likes/${userUid} 下,您只需检查该路径是否存在。它会极大地减少您的阅读。

借助 Firestore,您可以通过 increment FieldValue 调用轻松实现:

  const increment = admin.firestore.FieldValue.increment(1);

    await db
      .doc(`user_posts/${postAuthorUid}/posts/${postUid}`)
      .set({ comments: increment }, { merge: true });

如果不喜欢,只需将 1 更改为 -1

这就是您在 index.js 文件夹中的整个 functions 文件的样子:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();

exports.onLikeCreated = functions.firestore
  .document(`videos/{videoUid}/uservotes/{voteUid}`)
  .onCreate((snap, context) => {
    const db = admin.firestore();
    const { videoUid } = context.params;
    const { rating = 0 } = snap.data();

    const incrementLikes = admin.firestore.FieldValue.increment(1);
    const incrementRating = admin.firestore.FieldValue.increment(rating);

    return db
      .doc(`videos/${videoUid}`)
      .set({ likes: incrementLikes, rating: incrementRating }, { merge: true });
  });

exports.onLikeDeleted = functions.firestore
  .document(`videos/{videoUid}/uservotes/{voteUid}`)
  .onDelete((snap, context) => {
    const db = admin.firestore();
    const { videoUid } = context.params;
    const { rating = 0 } = snap.data();

    const incrementLikes = admin.firestore.FieldValue.increment(-1);
    const incrementRating = admin.firestore.FieldValue.increment(rating * -1);

    return db
      .doc(`videos/${videoUid}`)
      .set({ likes: incrementLikes, rating: incrementRating }, { merge: true });
  });

当有人为视频提供 vite 时,它​​会增加 likes 值。 likes 字段不需要是数组。您将直接获得计数。