Флаттер(дротик) не может быть удален из неизменяемого списка

#list #flutter #dart #crud

Вопрос:

Я использую карточки для салфеток tinder. Он обладает следующим свойством:

           swipeCompleteCallback:
               (CardSwipeOrientation orientation, int index) {
                    
                    updateStack(index);

               },
            ),
 

Функция обновления стека:

     class _TinderCardsState extends State<TinderCards>
    with TickerProviderStateMixin {
      List lstUsers = [];
      int lstUsersLength = 0;
     
     @override
     void initState() {
          super.initState();
          setState(() {
            lstUsers = users;
            lstUsersLength = users.length;
          });
      }

      void updateStack(int index) {
          setState(() {
           
              lstUsersLength = lstUsersLength - 1;
              lstUsers.removeAt(index);
          });
     }
 

Так что в основном просто пытаюсь удалить верхнюю карту из стопки. Я получаю вышеуказанную ошибку, даже если это виджет с отслеживанием состояния.
Почему я получаю эту ошибку?

Данные (просто файл дротиков со списком, без класса или чего-либо еще):

       const List users = [
{
 "id": "p1",
 "name": "John Doe",
 "age": "44",
 "imageUrl":
    "assets/images/anastasia-vityukova-unsplash-blackandwhiteimage.png",
"profession": "Financial Consultant"
 },
  ....
]
 

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

1. можете ли вы показать нам, какую именно ошибку вы получаете?

2. Возможно, это не связано с проблемой, но : lstUsers.remove(index)' will try to remove the item ìndex из списка. Вы должны использовать lstUsers.removeAt(index) . Также lstUsers.removeWhere((item) => index == index); будут удалены все элементы вашего списка, потому (index == index) что всегда будет верно. Может быть, вы получили ошибку с этой частью без комментариев?

3. Каково определение списка пользователей? Вы назначаете пользователей LSTUSER пользователям Пользователи LSTUSER = пользователи; Можно ли изменить список пользователей?

Ответ №1:

Удалите const раньше List users = [...] .

Вы объявляете пользователей константой времени компиляции. Вот что делает его неизменяемым.

В dart объекты передаются по ссылке. Когда вы пишете lstUsers = users; , пользователи LST становятся «представлением» пользователей, а затем также становятся неизменяемыми.

Еще один способ избежать этого : lstUsers = users.toList() . Затем он предоставляет пользователям LST значение нового списка, созданного из пользователей.

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

1. Не могу поверить, что я этого не видел.

2. Я отредактировал, чтобы включить другой способ, позволяющий пользователям оставаться постоянными.