Как обновить позиции 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, что приводит к сбою. Есть ли способ сделать это надежно?
Закомментированный раздел - это предыдущие попытки, которые не сработали, и я пытался их уже несколько часов.
Спасибо!