Проблема с анимированным списком флаттеров
Я делаю анимированный список с Flutter, где вы можете щелкнуть элемент в списке, чтобы удалить его. Иногда неправильный элемент удаляется из списка, хотя. Вы можете наблюдать описанное поведение в конце этого видео. Кажется, что я нажимаю на элемент в анимированном списке, прежде чем он будет перестроен с правильным индексом. Таким образом, я нажимаю на элемент с прежним индексом в этой позиции. Например, я щелкаю элемент с индексом 0, а затем, прежде чем элементы списка перестраиваются, я щелкаю элемент, который занял место удаленного элемента, до завершения анимации удаленного элемента. Таким образом, я нажимаю на элемент, который имеет индекс, но на самом деле теперь отображается с индексом 0.
Я пробовал несколько вещей, таких как отслеживание, если элемент в данный момент удаляется. К сожалению, без успеха.
Теперь на мой вопрос: кто-нибудь знает, как я могу решить эту проблему?
Мой код можно найти здесь.
class TodoItemWidget extends StatelessWidget {
TodoItemWidget(this.item, this.listKey, this.index, {this.clickable = true});
final GlobalKey<TodoItemListWidgetState> listKey;
final TodoItem item;
final int index;
final bool clickable;
void complete() {
//int index = listKey.currentState.list.indexOf(item);
listKey.currentState.removeItem(index);
}
@override
Widget build(BuildContext context) {
bool deadlinePassed = DateTime.now().isAfter(item.deadline);
Color backgroundColor = deadlinePassed ? Colors.red : null;
Color textColor = deadlinePassed ? Colors.white : Colors.black;
return Column(
children: <Widget>[
Material(
color: backgroundColor,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 32.0),
child: Row(
children: <Widget>[
Expanded(
child: Padding(
padding: EdgeInsets.symmetric(vertical: 16.0),
child: Text(item.title, style: Theme.of(context).textTheme.title.copyWith(color: textColor)),
),
),
SizedBox(width: 16),
Padding(
padding: EdgeInsets.only(top: 4.0, bottom: 12.0),
child: Column(
children: <Widget>[
IconButton(
onPressed: clickable ? complete : null,
icon: Icon(Icons.check),
color: textColor,
),
Text(_getDateString(item.deadline), style: Theme.of(context).textTheme.body1.copyWith(fontSize: 12.0, color: textColor),),
],
),
),
],
),
),
),
SizedBox(height: 1.0),
],
);
}
String _getDateString(DateTime date) {
return DateFormat("dd.MM.yyyy").format(date);
}
}