Флаттер: Добавление списка объектов в Firestore

# #flutter #google-cloud-firestore

Вопрос:

У меня есть массив внутри документа Firestore. В массиве хранится список карт.

Структура Пожарного Магазина

Итак, я хочу обновить данные по определенному индексу, но Firestore не разрешает обновление индекса. Поэтому мне пришлось извлечь весь массив и обновить данные по объектам, а затем загрузить массив обратно в Firestore. Однако я продолжаю получать эту ошибку, в которой говорится:» Недопустимый аргумент: экземпляр «Оценить..» Массив находится в списке объекта оценки.

 class Evaluate {
  String sb;
  double mk;

  Evaluate({this.sb, this.mk});
}

class EvaluateList {
  List<dynamic> evaluateList = [];

  EvaluateList({this.evaluateList});
}
 

Я зашел в тупик, потому что я не знаю, как загрузить его сейчас, так как он есть на карте, и я все перепробовал. Я на самом деле не практикую карту, потому что это для меня в новинку, но мне пришлось применить карту для этих данных, потому что это единственный метод, и теперь у меня не хватает времени на попытки и ошибки. Итак, кто-нибудь может помочь мне решить эту проблему? Заранее спасибо 🙂

Вот моя функция Firestore:

     Future getEvData(String sEv, double nEv) async {

    //manage document snapshot
    DocumentSnapshot evSnapshot = await evCollection.document(uid).get();
    var evMap = evSnapshot.data['evaluate'];
    List<Evaluate> dataEv = extractEvaluation(evMap);

    // calculation for new data
    double oldEv;
    int index = 0;
    int evIndex;

    dataEv.forEach((e) {
      if (e.sb == sEv) {
        oldEv = e.mk;
        evIndex = index;
      }
      index  ;
    });

    double newEv = (oldEv   nEv) / 2;
    double percentEv = newEv / 5 * 100;
    dataEv[evIndex].mk = percentEv;

    // update to firestore
    return await evCollection.document(uid).updateData({
      "evaluate": dataEv,
    });

  }
 

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

Ответ №1:

Я собираюсь игнорировать класс модели Evaluate здесь, потому что он избыточен. Так dataEv и есть List<Map<String, dynamic>> . Сначала вам нужно удалить точный элемент из списка. С помощью removeAt

 dataEv.dataEv.removeAt(index);
 

или использовать removeWhere , когда ‘mk 30

 dataEv.removeWhere((item) => item['mk'] == 30);
 

и когда » sb «- это «химия»

 dataEv.removeWhere((item) => item['sb'] == 'chemistry');
 

Затем вы должны добавить новый элемент в список. Например, если вы хотите обновить » mk «химии» sb » с 30 до 50. Тебе это нравится.

 dataEv.add({'mk': 50, 'sb': 'chemistry'});
 

если вы хотите обновить «sb», вы меняете значение » sb » следующим образом

 dataEv.add({'mk': 30, 'sb': 'physics'});
 

Однако, если вы хотите обновить элемент с тем же индексом, вам необходимо сначала сохранить индекс удаленного элемента с помощью indexOf или indexWhere затем использовать этот индекс для обновления списка с помощью insert . Но я думаю, что тебе не нужно этого делать. Так как вы можете легко sort составить список.

наконец, обновитесь dataEv до firestore.

Комментарии:

1. Большое вам спасибо за ответ. Я очень благодарен вам за то, что вы потратили свое время на изучение моего кода. Я получил ошибку при удалении, так как мой список имеет фиксированную длину. Однако ваша идея сначала удалить, а затем добавить новые данные действительно полезна, потому что я могу это сделать. Поэтому вместо этого я удаляю конкретную карту из массива с помощью arrayRemove. Вместо обновления всего массива я добавляю новые обновленные данные, которые я удалил ранее. Еще раз спасибо вам 🙂

2. Это оффтопик, но я думаю, что это хорошая практика, чтобы назвать вашу переменную удобочитаемой, чтобы устранить путаницу. Вместо названия mk, sb, Ev, затем как отметки, тема, оценка. Какую ошибку вы получаете при использовании removeWhere ? Не имеет значения, исправлена ли она.

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