Как я могу увеличить значение из firebase? - PullRequest
3 голосов
/ 18 июня 2019

Я пытаюсь разработать функцию, в которой при нажатии значка номер базы будет увеличиваться на 1, при повторном нажатии значка он будет увеличиваться на -1 и отображать общее количество лайков, возвращающихся в виде текста.().нанизывать()".Я пытаюсь использовать "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: () {

            },
          )),
    ),

1 Ответ

4 голосов
/ 18 июня 2019

Я не вижу, какой документ вы пытаетесь обновить. Вам нужна ссылка на документ.

Обновление: 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...