Анимация изменения положения элементов ListView во Flutter
У меня есть ListView
чья сортировка зависит от состояния его элементов: Item
объекты модели имеют bool
свойство, isActive
, и все Item
s со значением true
сортируются раньше всех со значением false
. Нажатие на элемент переключает егоisActive
государство. Логика установки состояния не выполняется в самом списке; скорее, это выполняется BLoC, который также знает, как сортировать элементы. В результате весь список получает потокList<Item>
которые правильно отсортированы.
В настоящее время результат довольно неприятный - нажатый элемент исчезает со своего места и появляется где-то еще в списке, и я хотел бы сделать его более плавным, например, возможно, анимировать изменение положения - что-то вроде того, что ReorderableListView
делает, но программно. Понятия не имею, как это сделать, начал возиться сAnimatedList
но я не уверен, что это правильный компонент для моего варианта использования - он может анимировать удаления и добавления, что на самом деле не то, что я делаю (я мог бы добавить удаление сразу, а затем добавление, но это кажется сложным).
Это код, который у меня есть (упрощенный), он поддерживает удаление анимации:
class ItemListWidget extends StatelessWidget {
final items = [
'Item A',
'Item B',
'Item C',
'Item D',
'Item E',
];
@override
Widget build(BuildContext context) {
return AnimatedList(
initialItemCount: items.length,
itemBuilder: (context, index, animation) {
final item = items[index];
return ListTile(
title: Text(item),
onTap: () {
final state = AnimatedList.of(context);
state.removeItem(
index,
(context, animation) => SizeTransition(
sizeFactor: animation,
child: ListTile(title: Text(item)),
),
// duration: const Duration(seconds: 5),
);
items.removeAt(index);
},
);
},
);
}
}
Он удаляет элемент, теперь мне нужно будет как-то прикрепить добавление элемента снова с другим индексом, когда анимация удаления будет готова. Но это просто не кажется правильным, я не думаю, что смогу анимировать позицию
Другое дело, что меня изрядно смущает API, я не уверен, правильно ли я его использую. Я никогда не используюanimation
параметр в itemBuilder
потому что я не понимаю, для чего я могу это использовать.
Как я могу реализовать это во Flutter?