我正在尝试建立一个函数,其中当按下图标时,firebase编号将增加1,当再次按下图标时,其编号将增加-1,并且显示的赞总数以“文本”形式返回().toString()”。我正在尝试使用“ FieldValue.increment”,但不幸的是,该数目并未在Firebase上增加。我究竟做错了什么?预先感谢您的帮助!
class LanchonetesContact extends StatefulWidget {
final DocumentSnapshot lanchonetes;
LanchonetesContact(this.lanchonetes);
@override
_LanchonetesContactState createState() =>
_LanchonetesContactState();
}
class _LanchonetesContactState extends State<LanchonetesContact> {
bool liked = false;
_pressed() {
setState(() {
liked = !liked;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
Navigator.pop(context);
}),
title: Text("Lanchonetes"),
centerTitle: true,
backgroundColor: Colors.purple[900],
actions: <Widget>[
IconButton(
icon: Icon(
liked ? Icons.favorite : Icons.favorite_border,
color: Colors.white,) ,
onPressed: () {
_pressed();
if(liked){
Firestore.instance.collection('lanchonetes')
.document("")
.updateData({"likes": FieldValue.increment(1)});
}else {
Firestore.instance.collection('lanchonetes')
.document("")
.updateData({"likes": FieldValue.increment(-1)});
}
}
)],
),
Padding(
padding: EdgeInsets.only(top: 3.0),
child: Card(
elevation: 1.0,
child: GestureDetector(
child: Container(
height: 100.0,
width: 500.0,
color: Colors.white,
child: Padding(
padding: EdgeInsets.symmetric(
vertical: 30.0, horizontal: 15.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(Icons.favorite, color: Colors.black,),
Text(widget.lanchonetes.data["likes"].toString()),
],
),
),
),
onTap: () {
},
)),
),
答案 0 :(得分:4)
我没有看到您要更新的文档。您需要文档参考。
更新:FieldValue.increment
可以正常工作,并且是最短的方法。
// Get document reference
final DocumentReference docRef = Firestore.instance.collection("lanchonetes").document(REPLACE_WITH_ID);
docRef.updateData({"likes": FieldValue.increment(1)});
另一种方法是为其创建事务:
final TransactionHandler transactionHandler = (Transaction tran) {
tran.get(docRef).then((DocumentSnapshot snap) {
if (snap.exists) {
tran.update(docRef, <String, dynamic>{'likes': snap.data['likes'] + 1});
// update state by calling _pressed() or anything else you like
}
});
};
Firestore.instance.runTransaction(transactionHandler);
这将是您的like()
方法,对于dislike()
,您显然将snap.data['likes'] + 1
替换为snap.data['likes'] - 1
答案 1 :(得分:0)
一段时间后,我又回到了同样的情况,经过研究,我找到了答案。我只需要将我的文档指定为“ widget.lanchonetes.documentId”,因此firebase会根据我选择的文档读取数据,而无需指定它。
Firestore.instance.collection('lanchonetes')
.document(widget.lanchonetes.documentId)
.updateData({"likes": FieldValue.increment(1)});