новые документы создаются, даже если пользователь такой же? - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь загрузить значение нескольких текстовых полей, но firestore продолжает сбрасывать все значения, поэтому старые исчезают. Я хотел бы иметь возможность установить значение для первого текстового поля (alOne) и, возможно, вернуться позже и установить значение для второго текстового поля (alTwo). но в моем случае, когда задано второе значение, первое исчезает из хранилища?

это моя функция сообщения

  static void createPostMonday(Post post) async{
await postsRef.document(post.authorId).setData({



  'alOne':post.alOne,
  'alTwo':post.alTwo,
  'alThree':post.alThree,
  'alFour':post.alFour,
  'alFive':post.alFive,
  'alSix':post.alSix,
  'beOne':post.beOne,
  'beTwo':post.beTwo,
  'beThree':post.beThree,
  'beFour':post.beFour,
  'beFive':post.beFive,
  'beSix':post.beSix,
  'likes': post.likes,
  'authorId': post.authorId,
  'timestamp': post.timestamp,
},merge: true);

, а вот кнопка действия (отправки)

  _submit() async{
Post post = Post(
  authorId: Provider.of<UserData>(context, listen: false).currentUserId,
  timestamp: Timestamp.fromDate(DateTime.now()),
  alOne1: _alOne1,
  alTwo1: _alTwo1,
  alThree1: _alThree1,
  alFour1: _alFour1,
  alFive1: _alFive1,
  alSix1: _alSix1,
  beOne1: _beOne1,
  beTwo1: _beTwo1,
  beThree1: _beThree1,
  beFour1: _beFour1,
  beFive1: _beFive1,
  beSix1: _beSix1,

);
DatabaseService.createPostMonday(post);
Navigator.pop(context);

}

и это 2. из моих текстовых полей

   Padding(
            padding: EdgeInsets.symmetric(horizontal: 30.0),
            child: TextField(
              style: TextStyle(fontSize: 18.0),
              decoration: InputDecoration(
                labelText: 'Alternativ',
              ),
              onChanged: (input) => _alOne1 = input,
            ),
          ),
          Padding(
            padding: EdgeInsets.symmetric(horizontal: 30.0),
            child: TextField(
              style: TextStyle(fontSize: 18.0),
              decoration: InputDecoration(
                labelText: 'Beskrivning',
              ),
              onChanged: (input) => _beOne1 = input,
            ),
          ),

1 Ответ

0 голосов
/ 11 апреля 2020

Вы звоните setData, который заменяет все существующие данные в документе данными, которые вы передаете.

Если вы хотите объединить передаваемые данные с любыми существующими данными, которые в документе уже есть две опции:

  1. Используйте метод updateData , который обновляет документ с предоставленными вами данными. Эта операция записи завершится ошибкой, если документ еще не существует.

  2. Передать { merge: true } в качестве второго параметра в setData(), и в этом случае данные будут объединены, и документ будет создан, если он еще не существует.

Я обычно использую этот второй подход, так как я обычно не знаю / не волнует, является ли документ уже существует.


Я только что запустил этот код в одном из моих приложений:

var ref = Firestore.instance.collection("chat").document();
ref.setData({ 
    'message': "hello", 
    'timestamp': new DateTime.now().millisecondsSinceEpoch,
    'uid': (await getUser()).uid 
  }).whenComplete(() {
    ref.setData({ 'message': "hello good welcome"  }, merge: true);
  });

Так вот:

  1. Создать новый DocumentReference
  2. Устанавливает три поля в этом документе
  3. Затем обновляет одно из этих полей

После запуска этого кода у меня есть три поля: timestamp и uid с их значением из исходных setData(...) и message с обновленным значением из setData(..., merge: true).

...