【问题标题】:How can I increment a value from firebase?如何从 firebase 增加一个值?
【发布时间】:2019-06-18 12:28:38
【问题描述】:

我正在尝试详细说明一个函数,当按下图标时,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: () {

            },
          )),
    ),

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

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

    更新: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

    【讨论】:

    • 关于空文档 ID 的好消息。但请注意,不需要交易。 FieldValue.increment() 运算符已经受到保护,不会被不同用户覆盖。如果您愿意,它几乎可以在数据库级别上运行一个小型事务。
    • @FrankvanPuffelen 感谢您提供的信息,我会相应地更新我的答案。
    • 谢谢伙计们,它真的有效!在这种情况下,我没有指定 documentID 因为我希望它发生在集合中的所有文档上。
    • @Ricardo:Firestore 没有等效的 SQL UPDATE lanchonetes SET ... WHERE ...。更新文档,您需要知道该特定文档的完整路径。因此,要更新 每个 文档,您需要知道每个文档的完整路径。这通常意味着您需要阅读文档,遍历查询快照,然后逐一或批量更新它们。
    • @FrankvanPuffelen 我虽然有可能,但感谢您提供的信息,您是专业人士!!
    【解决方案2】:

    一段时间后,我回到了同样的情况,经过一些研究,我找到了答案。我只需要将我的文档指定为“widget.lanchonetes.documentId”,这样firebase就会根据我选择的文档读取数据,无需指定。

    Firestore.instance.collection('lanchonetes')
    .document(widget.lanchonetes.documentId)
    .updateData({"likes": FieldValue.increment(1)});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-09
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 2013-02-23
      • 2018-07-03
      相关资源
      最近更新 更多