Как правильно удалять элементы из локальной базы, если изменилась индексация после сортировки?

Я добавляю элементы, они сохраняются в 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()} руб.'),
                      ),
                    ),
                  );
                },
              );
      });
}

Ответы (0 шт):