Как правильно удалять элементы из локальной базы, если изменилась индексация после сортировки?
Я добавляю элементы, они сохраняются в HiveBox и выводятся с помощью ListView. Элемент содержит набор данных для ручного ввода. В наборе есть date. Перед построением ListView включена сортировка элементов по убыванию date. В итоге, если первый элемент имеет, к примеру, 3 число месяца, а второй 5-е, то по условиям сортировки я увижу 3-е число вторым в списке ListView, что верно. Но, если я удаляю второй элемент на экране, то при этом реально удалится первый. Получается, что HiveBox также удаляет у себя второй элемент с индексом 1, который в ListView на первой позиции из-за сортировки, поэтому он и удаляется.
При этом, как выяснилось, неважно, работает сортировка до ListView или внутри него. Также, если получать данные не из expensesList, а с помощью box.getAt(index), то в этом случае сортировка не работает.
Я не могу отказаться ни от сортировки, ни от удаления. Посоветуйте, как тут быть?
var expenseBox = Hive.box<Expense>('expenses_box');
class ExpensesList extends StatefulWidget {
const ExpensesList({super.key});
@override
State<ExpensesList> createState() => _ExpensesListState();
}
class _ExpensesListState extends State<ExpensesList> {
@override
Widget build(BuildContext context) => ValueListenableBuilder(
valueListenable: expenseBox.listenable(),
builder: (context, box, _) {
List<Expense> expensesList = box.values.toList();
expensesList.sort((a, b) => b.date.compareTo(a.date));
return box.values.isEmpty
? Center(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 40),
child: Text(
'Ваше счастье - здесь пусто!',
style: Theme.of(context).textTheme.headlineMedium,
textAlign: TextAlign.center,
),
),
)
: ListView.builder(
itemCount: expensesList.length,
itemBuilder: (ctx, index) {
// Удаление смахиванием
return Dismissible(
key: UniqueKey(),
onDismissed: (direction) {
box.deleteAt(index);
expensesList.removeAt(index);
},
//
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 4),
child: ListTile(
leading: Icon(categoryIcons[expensesList[index].category]),
title: Text(expensesList[index].title),
subtitle: Text(expensesList[index].formattedDate),
trailing: Text('${expensesList[index].amount.ceil()} руб.'),
),
),
);
},
);
});
}