Проблема с анимированным списком флаттеров

Я делаю анимированный список с 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);
  }

}

0 ответов

Другие вопросы по тегам