Как получить, изменить и установить поле из Firestore в документе?

У меня есть приложение для планирования, и одним из моих свойств является DateTime. Я хочу иметь возможность «отталкивать» или «передвигать вперед» все временные метки в часах/минутах с помощью пользовательского ввода. Моя проблема заключается в том, что при попытке использовать мой метод PushPull требуется экземпляр DocumentSnapshot, который я не знаю, как создать экземпляр.

У меня есть четыре текстовых поля для выталкивания/вытягивания часов/минут, которые выглядят так:

        TextField( controller: pullHourController,
 decoration: const InputDecoration(hintText: 'Hours'),
    onChanged: (newValue) =>
    pullHourController.setSelected(newValue),),

Затем я разбираю строку на целые числа, например:

late int pullHour = int.parse(pullHourController.text);

и мой метод pushpull, который я надел на кнопку:

CollectionReference products =
      FirebaseFirestore.instance.collection('products');

Future pushPull(DocumentSnapshot documentSnapshot) async {
    Timestamp timestamp = await documentSnapshot.get('Start Time');
    late DateTime d = timestamp.toDate();
    late DateTime added = DateTime(d.year, d.month, d.day,
        d.hour - pullHour + pushHour, d.minute - pullMinute + pushMinute);

    await products.doc().set({'Start Time': added}).catchError((error) =>
        {Get.snackbar("Failed to change time: $error", 'Please try again.')});

    throw (e) => Get.snackbar('Error', (e).toString());
  }

Однако, когда я пытаюсь использовать это в своем onPressed, мне нужен documentSnapshot в качестве позиционного аргумента, но он недоступен локально:

onPressed: () async {
                      pushPull();
                    },

Я пытался избавиться от скобок типа pushPull, но ничего не происходит при нажатии.

Поскольку вы хотите обновить существующий документ, вам необходимо знать идентификатор документа, который вы хотите обновить. Вы это знаете? Можете ли вы показать это в коде в вашем вопросе?

Frank van Puffelen 21.03.2022 23:12

@FrankvanPuffelen Привет, я пытаюсь обновить все документы в коллекции «продукты». Все они содержат поле «время начала».

Dylan Martin 21.03.2022 23:35
Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
1
2
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

  1. Прочитать все документы из коллекции.

  2. Прокручивайте их один за другим в коде вашего приложения.

  3. Вычислите новое значение для каждого документа и запишите его обратно в базу данных.

Определенно не ожидал, что облачный сотрудник поможет мне с моим первым вопросом. Вы только что спасли меня от еще 8 часов головной боли, спасибо!

Dylan Martin 22.03.2022 00:12

Другие вопросы по теме