Вместо обновленного создается новый документ

#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 после него