如何从Firebase递增值?

时间:2019-06-18 12:28:38

标签: firebase flutter google-cloud-firestore

我正在尝试建立一个函数,其中当按下图标时,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: () {

            },
          )),
    ),

2 个答案:

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