我有一个Firestore数据的产品列表的StreamProvider
StreamProvider<List<Product>>.value(
value: DatabaseService().products,
),
现在我有此产品列表的详细信息页面 如果我单击详细信息页面的列表,则将一个对象带入详细信息页面
DetailsPage(courseData: product)
我需要在此详细信息页面中创建一个upvote按钮,以便它也可以更改Firestore数据
if (voted) {
FirebaseFirestore.instance
.collection('products')
.doc('${widget.courseData.id}')
.update({"voteCount": widget.courseData.voteCount - 1});
} else {
FirebaseFirestore.instance
.collection('products')
.doc('${widget.courseData.id}')
.update({"voteCount": widget.courseData.voteCount + 1});
}
isVoted = !isVoted;
} catch (e) {
print(e.message);
}
如果单击upvote按钮,则CourseData不会更改,因为其值不是来自streamProvider而是来自
DetailsPage(courseData:产品)
我应该如何解决这个问题
答案 0 :(得分:0)
我建议您使用increment()
操作来实现相同目的,而不是传递您不知道的新值。
if (voted) {
FirebaseFirestore.instance
.collection('products')
.doc('${widget.courseData.id}')
.update({"voteCount": firebase.firestore.FieldValue.increment(-1) });
} else {
FirebaseFirestore.instance
.collection('products')
.doc('${widget.courseData.id}')
.update({"voteCount": firebase.firestore.FieldValue.increment(1) });
}
isVoted = !isVoted;
} catch (e) {
print(e.message);
}
除了不需要知道当前值(我认为这是您的问题)之外,它在离线和多用户方案中也能更好地工作。