Я создал список, чтобы попытаться отобразить проблему, с которой я столкнулся с трепетанием.
Каждый раз, когда вы нажимаете кнопку элемента списка, кнопка под ним удаляется. Как видно из гифки ниже, при нажатии на кнопку создается вторая копия нижнего элемента.
Приостановленная мид анимация выглядит так:
Чтобы создать AnimtedList, я начал с присвоения ему глобального ключа:
final GlobalKey<AnimatedListState> _ListKey = GlobalKey();
Затем я создаю такой список цветов:
List<Color> listColors = [Colors.orange, Colors.green, Colors.red, Colors.blue, Colors.yellowAccent, Colors.brown,];
Затем у меня есть такой AnimatedList, который имеет начальный размер длины listColors и дочерний элемент _buildListItem:
AnimatedList(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
key: _ListKey,
initialItemCount: listColors.length,
itemBuilder: (context, index, animation) {
return _buildListItem(index, animation);
},
),
Это метод элемента списка сборки, SizeTransition, у которого есть дочерний элемент List_Element:
SizeTransition _buildListItem(int index, Animation<double> animation,) {
return SizeTransition(
sizeFactor: animation,
child: List_Element(index),
);
}
Это List_Element, строки списка с простой кнопкой, цвет которой задается индексом списка цветов. В методе onPressed я вызываю функцию removeFromListFunction, чтобы удалить строку ниже.
class List_Element extends StatefulWidget {
int listIndex;
List_Element(int listIndex) {
this.listIndex = listIndex;
}
@override
_List_ElementState createState() => _List_ElementState();
}
class _List_ElementState extends State<List_Element> {
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(4),
child: Container(
width: double.infinity,
height: 50,
child: RaisedButton(
color: listColors[widget.listIndex],
elevation: 2,
child: Center(child: Text("List item " + widget.listIndex.toString(), style: TextStyle(fontWeight: FontWeight.bold),),),
onPressed: (){
_removeFromList(widget.listIndex);
},
),
),
);
}
}
Это функция removeFromList:
void _removeFromList(int index) {
listColors.remove(int);
_ListKey.currentState.removeItem(index+1,
(BuildContext context, Animation<double> animation) {
return _buildListItem(index, animation);
});
}
Я не уверен, что это проблема с анимированным списком или, что более вероятно, моя реализация.
Спасибо за вашу помощь