首页 > 解决方案 > 如何在颤振中使用计数器?

问题描述

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

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 目前列表为空,因此没有用户投票,但星号为黄色

标签: firebaseflutterdartgoogle-cloud-firestore

解决方案


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

使用 firestore,您可以通过incrementFieldValue 调用轻松完成:

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

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


推荐阅读