我正在尝试在我的应用程序中使用计数器来保存喜欢的内容。 这是我目前的代码
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 目前列表是空的,所以没有用户投票,但星星是黄色的
答案 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
字段不需要是数组。您将直接获得计数。