如何从 firebase 增加值?

Ric*_*itz 3 firebase flutter google-cloud-firestore

我正在尝试详细说明一个函数,当按下图标时,firebase 数字会增加 1,当再次按下图标时,它会增加 -1 并且它会显示总喜欢返回为“Text()”。 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: () {

            },
          )),
    ),
Run Code Online (Sandbox Code Playgroud)

Loo*_*oii 12

我看不到您要更新的文档。您需要文档参考。

更新:FieldValue.increment工作得很好,是最短的方法。

// Get document reference
final DocumentReference docRef = Firestore.instance.collection("lanchonetes").document(REPLACE_WITH_ID);
docRef.updateData({"likes": FieldValue.increment(1)});
Run Code Online (Sandbox Code Playgroud)

另一种方法是为它创建一个事务:

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);
Run Code Online (Sandbox Code Playgroud)

这将是您的like()方法,因为dislike()您显然替换snap.data['likes'] + 1snap.data['likes'] - 1

  • 关于空文档 ID 的好消息。但请注意,不需要事务。`FieldValue.increment()` 运算符已经受到保护,可以防止来自不同用户的覆盖。如果您愿意,它几乎可以在数据库级别运行一个小型事务。 (3认同)