#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. теперь я могу изменить данные, но проблема в том, чтобы показать, что они меняются в реальном времени, но поскольку я получил данные как объект из класса. я не изменился, я вышел со страницы и снова щелкнул карточкой на обновленной странице.