как увидеть изменения количества голосов с помощью StreamProvider

#flutter #dart #google-cloud-firestore #flutter-provider

#flutter #dart #google-облако-firestore #flutter-provider

Вопрос:

У меня есть StreamProvider списка продуктов и данных firestore

  StreamProvider<List<Product>>.value(
        value: DatabaseService().products,
      ),
  

Теперь у меня есть страница сведений для этого списка продуктов
, если я нажимаю на страницу списка для получения подробной информации, я передаю один объект на страницу сведений

 DetailsPage(courseData: product)
  

Мне нужно создать кнопку upvote на этой странице сведений, чтобы она также менялась в данных firestore

   if (voted) {
        FirebaseFirestore.instance
            .collection('products')
            .doc('${widget.courseData.id}')
            .update({"voteCount": widget.courseData.voteCount - 1});
      } else {
        FirebaseFirestore.instance
            .collection('products')
            .doc('${widget.courseData.id}')
            .update({"voteCount": widget.courseData.voteCount   1});
      }
      isVoted = !isVoted;
    } catch (e) {
      print(e.message);
    }
  

Здесь данные курса не изменяются, если он нажал кнопку upvote, поскольку его значение не из StreamProvider, а из

Страница подробностей (данные курса: продукт)

Как мне решить эту проблему

Ответ №1:

Вместо того, чтобы передавать новое значение, которое вы не знаете, я бы рекомендовал использовать increment() операцию для достижения того же самого.

 if (voted) {
    FirebaseFirestore.instance
        .collection('products')
        .doc('${widget.courseData.id}')
        .update({"voteCount": firebase.firestore.FieldValue.increment(-1) });
} else {
    FirebaseFirestore.instance
        .collection('products')
        .doc('${widget.courseData.id}')
        .update({"voteCount": firebase.firestore.FieldValue.increment(1) });
    }
    isVoted = !isVoted;
} catch (e) {
  print(e.message);
}
  

Помимо того, что вам не нужно знать текущее значение (что, я думаю, является вашей проблемой), он также лучше работает как в автономном режиме, так и в многопользовательских сценариях.

Комментарии:

1. the widget.coursedata.id значение не будет обновляться в режиме реального времени, потому что оно получило значение от родительского только одного объекта, поэтому я бы хотел, чтобы оно также изменилось

2. теперь я могу изменить данные, но проблема в том, чтобы показать, что они меняются в реальном времени, но поскольку я получил данные как объект из класса. я не изменился, я вышел со страницы и снова щелкнул карточкой на обновленной странице.