#firebase #flutter #dart #google-cloud-firestore
# #firebase #флаттер #dart #google-облако-firestore
Вопрос:
У меня есть onPress
на странице редактирования — он должен обновлять документ при редактировании и сохранении.
Однако в настоящее время вместо этого создается новый документ с этими данными.
onPressed: () async {
//controllers...
await updateContact(context);
Navigator.pop(context, widget.contact);
}
.
final db = FirebaseFirestore.instance;
.
Future updateContact(context) async {
final uid = await TheProvider.of(context).auth.getCurrentUID();
await db
.collection('userData')
.doc(uid)
.collection('Contacts')
.doc(widget.contact.documentId)
.set({
'Name': oneController.text,
'PhoneNumber': int.tryParse(twoController.text),
'Location': threeController.text,
'Rating': int.tryParse(fourController.text),
'Instagram': fiveController.text,
'Birthday': int.tryParse(sixController.text),
'Notes': sevenController.text},
SetOptions(merge: true));
.
Contact.fromSnapshot(DocumentSnapshot snapshot) :
//...
documentId = snapshot.id;
Я не уверен, как наилучшим образом решить эту проблему.
Ответ №1:
Да, использование set()
переопределит все данные, уже присутствующие в firestore.
и да, использование update
— это правильный путь, но имейте в виду, чтобы не вызывать .toJson()
весь объект, поскольку обновление принимает только те поля, которые необходимо обновить. Поэтому, если вы обновите весь объект целиком, он снова создаст новый.
Вы могли бы передать его следующим образом
.update({'name': oneController.text, 'birth': twoContorller.text, 'email': threeController.text});
кроме того, вы также можете использовать set( setOptions: SetOptions(merge:true))
это, чтобы обновить только те поля, которые были изменены в документе.
Комментарии:
1. Спасибо, Самир. Куда мне поместить
set(setOptions: SetOptions(merge:true))
?2. @ashf Вместо
update()
того, чтобы использоватьset()
сSetOptions()
IDE, будет автозаполняться для вас, просто нажмите ctrl пробел3.
set(SetOptions(merge: true));
дает'The argument type 'SetOptions' can't be assigned to the parameter type 'Map<String, dynamic>'
4. Хорошо, похоже, что что-то могло быть изменено в версии плагина firebase, обратитесь к этой документации для получения дополнительной информации, я думаю, вам лучше пока пойти
update
.5. или, подождите минутку, вы ставите setOptions() перед json? Убедитесь, что json является первым аргументом, а затем setOptions после него