У меня есть коллекция 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.
Теперь моя проблема: как я могу использовать эту другую коллекцию с именем категории, идентификатором и индексом для сортировки коллекции продуктов по индексу категории?
@MunsifAli последний фрагмент кода/json — это данные категории.
Вы хотите отсортировать данные последнего фрагмента?
Чтобы отсортировать коллекцию «продукты» по индексу категории, вы можете сделать отдельный запрос к коллекции «категория», чтобы получить индекс категории, а затем использовать этот индекс для сортировки коллекции «продукты». Вы можете использовать следующий код для получения отсортированных данных о товарах:
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
@SameeraTennakoon создайте список sortedProductData необходимого размера со значением null, например sortedProductData = List.filled(collection.size, null)
, затем вставьте в список.
если вы хотите отсортировать данные последнего фрагмента, вы можете использовать метод сортировки, подобный этому
myList.sort((a, b) => int.parse(a["index"].toString())
.compareTo(int.parse(b["index"].toString())));
ознакомьтесь с полным кодом здесь https://dartpad.dev/?id=252d17ac9c3f254da2955bb90da83d29
можно прикрепить данные категории Data?