Как обновить позиции ReorderableListView в Firestore?

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

Все работает нормально, но я просто не могу заставить список работать с firebase/firestore. Каждый раз, когда я заказываю товар, он ломается.

Моя проблема в том, что я не могу правильно обновить позиции предметов в пожарном складе. У элементов есть поле «pos», которое должно определять их позицию в списке.

Список создается в виджете StreamBuilder, а затем вызывает "roerderItems" onChange.

Здесь функция переупорядочивания:

      void reorderItem(int oldIndex, int newIndex) async {
QuerySnapshot itemSnap = await itemCollection.getDocuments();

for (int i = 0; i < itemSnap.documents.length; i++) {
  if (i == newIndex) {
    itemSnap.documents[oldIndex].reference.updateData({"pos": i});
    continue;
  } else if (i == oldIndex) {
    continue;
  } else {
    itemSnap.documents[i].reference.updateData({"pos": i});
  }
}

// print(itemName);
// print('old: $oldIndex, new: $newIndex');
// for (int i = 0; i < itemSnap.documents.length; i++) {
//   if (i < oldIndex && i >= newIndex) {
//     print('1. i: $i, newInd: $newIndex');
//     itemSnap.documents[i].reference
//         .updateData({'pos': itemSnap.documents[i].data['pos'] + 1});
//   } else if (i >= oldIndex && i < newIndex) {
//     print('2. i: $i, newInd: $newIndex');
//     itemSnap.documents[i].reference
//         .updateData({'pos': itemSnap.documents[i].data['pos'] - 1});
//   }
// if (oldIndex > newIndex) {
//   if (i >= newIndex) {
//     print('i: $i, newInd: $newIndex');
//     itemSnap.documents[i].reference
//         .updateData({'pos': itemSnap.documents[i].data['pos'] + 1});
//   }
// } else {
//   if (i >= oldIndex) {
//     print('i: $i, newInd: $newIndex');
//     itemSnap.documents[i].reference
//         .updateData({'pos': itemSnap.documents[i].data['pos'] - 1});
//   }
// }
// }

// itemCollection.document(itemName).updateData({'pos': newIndex});
// itemSnap.documents.forEach((doc1) {
//   if (doc1.documentID != itemName && oldIndex < newIndex) {
//     if (doc1.data['pos'] <= newIndex) {
//       doc1.reference.updateData(
//           {'pos': (doc1.data['pos'] - 1) < 0 ? 0 : doc1.data['pos'] - 1});
//     }
//   } else if (doc1.documentID != itemName && oldIndex > newIndex) {
//     if (doc1.data['pos'] >= newIndex) {
//       doc1.reference.updateData({'pos': doc1.data['pos'] + 1});
//     }
//   }
// });
  }

Незакомментированная часть вверху - это моя текущая попытка, но она не удалась. Он продолжает создавать повторяющиеся записи pos в firebase, что приводит к сбою. Есть ли способ сделать это надежно?

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

Спасибо!

0 ответов

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