Flutter, как сортировать коллекцию Firestore на основе индекса другой коллекции

У меня есть коллекция FireStore с именем «продукты», и в ней есть документы, состоящие из данных о продукте, таких как имя, цена и категория. Это следует за структурой, как это

    {
     "name": "Milk Shake Strawberry",
     "price": "250",
     "category": "Drinks",
     "categoryID:1234
   },
   {
     "name": "Swiss Roll",
     "price": "150",
     "category": "Cake",
     "categoryID":1235
   }

Я сопоставляю все данные о продукте с ProductItemData, используя следующий код:

List<Map<String, dynamic>?>? productItemsData = snapshots.data?.docs
                              .map((e) => e.data() as Map<String, dynamic>?)
                              .toList();

Используя forEach, я собираю список имен категорий в этот

List<String> _tabs = [];

        for (var doc in productItemsData!) {
                            Map<String, dynamic> data =
                                doc as Map<String, dynamic>;
                            if (!_tabs.contains(data["category"])) {
                              _tabs.add(data["category"]);
                            }
                          }

Поэтому я могу показать данные (элементы продукта) в представлении TabBar. Со всеми продуктами под соответствующим названием категории.

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

    List<Widget> _list = [];
for (int i = 0; i < productItemsData!.length; i++) {
  if (productItemsData![i]!["category"] == category) {
    _list.add(_buildCustomProductTile(context, productItemsData![i]));
  }
} return list;

На данный момент мое требование работает на 100%, как и ожидалось. Но теперь я хочу изменить порядок категорий в соответствии с индексом, и когда пользовательский интерфейс показывает продукты, я хочу, чтобы они были в этом порядке.

Для хранения категорий и идентификаторов категорий у меня есть другая коллекция, и она похожа на эту:

    {
     "index": "0",
     "categoryName": "Drinks",
     "categoryID:1234
   },
   {
     "index": "1",
     "categoryName": "Cake",
     "categoryID":1235
   }

Используя ReorderableListView, я переупорядочиваю категории, изменяя индекс в функции onReorder.

Теперь моя проблема: как я могу использовать эту другую коллекцию с именем категории, идентификатором и индексом для сортировки коллекции продуктов по индексу категории?

можно прикрепить данные категории Data?

Munsif Ali 09.02.2023 13:44

@MunsifAli последний фрагмент кода/json — это данные категории.

Sameera Tennakoon 09.02.2023 17:50

Вы хотите отсортировать данные последнего фрагмента?

Munsif Ali 09.02.2023 18:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
117
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Чтобы отсортировать коллекцию «продукты» по индексу категории, вы можете сделать отдельный запрос к коллекции «категория», чтобы получить индекс категории, а затем использовать этот индекс для сортировки коллекции «продукты». Вы можете использовать следующий код для получения отсортированных данных о товарах:

List<Map<String, dynamic>> sortedProductData = [];
for (var doc in categoryData!) {
  Map<String, dynamic> data = doc as Map<String, dynamic>;
  for (var product in productItemsData!) {
    Map<String, dynamic> productData = product as Map<String, dynamic>;
    if (productData["category"] == data["categoryName"]) {
      sortedProductData.insert(data["index"], productData);
      break;
    }
  }
}

Примечание. categoryData — это данные, полученные из коллекции «категория», а productItemsData — данные, полученные из коллекции «товары».

Для этого метода я получаю следующую ошибку в точке «sortedProductData.insert(». Недопустимое значение: не входит в инклюзивный диапазон 0..5: 7

Sameera Tennakoon 08.02.2023 06:08

@SameeraTennakoon создайте список sortedProductData необходимого размера со значением null, например sortedProductData = List.filled(collection.size, null), затем вставьте в список.

FaaiqKhan 10.02.2023 17:01
Ответ принят как подходящий

если вы хотите отсортировать данные последнего фрагмента, вы можете использовать метод сортировки, подобный этому

   myList.sort((a, b) => int.parse(a["index"].toString())
    .compareTo(int.parse(b["index"].toString())));

ознакомьтесь с полным кодом здесь https://dartpad.dev/?id=252d17ac9c3f254da2955bb90da83d29

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

Не могу установить firebase. Возникает эта ошибка: не найдено podspec для `RNFirebase`
Эмулятор Firebase --inspect-functions выдает неподдерживаемое предупреждение
Uncaught (в обещании) FirebaseError: Firebase Storage: объект «Джон» не существует. (хранилище/объект не найден)
Как получить данные из одной коллекции firestore в другую?
Нужна помощь в выяснении того, как обновить состояние из значений списка, полученного асинхронной функцией в firestore
Почему startAfter в этом запросе firebase не работает?
Как получить данные коллекции Firestore как Observable в Angular?
Флаттер `StateError (Плохое состояние: невозможно получить поле на платформе DocumentSnapshot, которая не существует)` при попытке показать пользовательские данные
Исключение функций Firebase «не прошедшее проверку подлинности», но функция работает
Ошибка развертывания функции Firebase «Ошибка: токен обновления должен содержать свойство client_id»