Флаттер Скользящий остается открытым после удаления элемента из списка

#flutter #dart #listview #indexing #flutter-animatedlist

Вопрос:

Я использую Slidable внутри списка, чтобы я мог удалять элементы. Проблема в том, что если я удаляю элемент из списка, новый элемент открывается с возможностью скольжения. Очевидно, что это нежелательное поведение. Вот видео с экрана для лучшего понимания.

Мой список-это анимированный список:

 
`                       child: AnimatedList(
                            padding: EdgeInsets.zero,
                            shrinkWrap: true,
                            key: listKey,
                            initialItemCount: widget.month.memories.length,
                            itemBuilder: (context, index, animation) {
                              return slideIt(
                                context,
                                widget.month.memories[index],
                                index,
                                animation,
                              );
                            },
                          ),`
 

И вот мой Скользящий:

 ` Widget slideIt(
    BuildContext context,
    Memory memory,
    int index,
    animation,
  ) {
    return SlideTransition(
      position: Tween<Offset>(
        begin: const Offset(-1, 0),
        end: Offset(0, 0),
      ).animate(
        CurvedAnimation(
          parent: animation,
          curve: Curves.easeIn,
          reverseCurve: Curves.easeOut,
        ),
      ),
      child: Slidable(
        actionPane: SlidableDrawerActionPane(),
        actionExtentRatio: 0.25,
        movementDuration: Duration(milliseconds: 400),
        child: Column(
          children: [
            MemoryTile(
              memory: memory,
              monthName: widget.month.name,
              onTapped: () {
                _removeMemoryAtIndex(index, memory);
                print('tap on ${memory.description}');
              },
            ),
            SizedBox(
              height: scaleWidth(20),
            ),
          ],
        ),
        secondaryActions: [
          SlideAction(
            closeOnTap: false,
            color: AppColors.secondary,
            onTap: () => {
              _removeMemoryAtIndex(index, memory),
            },
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Icon(
                  CupertinoIcons.trash_fill,
                  color: AppColors.primary,
                  size: 30,
                ),
                SizedBox(
                  height: scaleWidth(5),
                ),
                Text(
                  'Löschen',
                  style: AppTextStyles.montserratH6SemiBold,
                ),
                SizedBox(
                  height: scaleWidth(20),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }`
 

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

Ответ №1:

Вы должны назначить ключ для своих слайдов. Когда Flutter управляет своим состоянием, он использует для этого три дерева: дерево виджетов, дерево элементов и дерево объектов визуализации. Когда виджет закрывается, flutter пытается синхронизировать остальные виджеты с соответствующими элементами с помощью простого равенства типов. Итак, вот почему ваше приложение ведет себя таким образом. Flutter берет первый оставшийся виджет плюс первый элемент и сравнивает, имеют ли они один и тот же тип. Если они есть, то Flutter использует состояние элемента для отображения соответствующего объекта визуализации. Последний элемент дерева элементов будет просто удален. Итак, вам нужно добавить ключи, и Flutter дополнительно будет использовать их для синхронизации виджетов и элементов желательным способом.

У каждого виджета Flutter есть Key поле. Вы должны назначить их при создании экземпляра виджета. Вы можете использовать некоторые служебные классы для создания такого ключа — например, ValueKey(), uniqueKey и т.д. Кроме того, вы можете использовать свои собственные ключи, если они есть в ваших данных.

Комментарии:

1. спасибо за ваш ответ! Я совсем новичок в flutter, так как же мне добавить ключи? 😀

2. nvm, я понял: key: Key(memory.description), добавление этого в скользящее исправило это! Спасибо, чувак 🙂

3. @Крис, я все равно добавил это в свой ответ 🙂