Как решить проблему: «Уволенный виджет« Отклоняемый »все еще является частью дерева» при использовании блока - PullRequest
0 голосов
/ 28 октября 2019

при реализации виджета Dismissible У меня ошибка при удалении элемента.

    return Dismissible(
      key: Key(widget.product.id),
      onDismissed: (direction) {
        setState(() {
          BlocProvider.of<ManagerBloc>(context)
              .add(RemoveProduct(widget.product));
        });

Родитель этого потомка выглядит как

          return ListView.builder(
              itemCount: state.shopItem.length,
              itemBuilder: (BuildContext context, int index) {
                return ProductElement(product: state.shopItem[index]);
              });
        }

Я переместил его в родительский элемент и удалил shopItem.removeAt() с BlocProvider, но все же я получил это isseu. Даже если я удаляю объект, используя remove в списке, он показывает то же самое сообщение об ошибке:

    if (event is RemoveProduct) {
      await shopListRepository.remove(event.product);
      yield DefaultDataManager((state as DefaultDataManager)
          .shopItem
          .where((item) => item.id != event.product.id)
          .toList());
    }

Я попытался UniqueKey, и это был тот же самый результат. Мой product_id - '64b7ff60-f782-11e9-a3e8-a9ee0aa87ea5', сгенерированный uuid.v1 ().

1 Ответ

0 голосов
/ 28 октября 2019

Мне кажется, проблема в том, что вы не удаляете модель данных, список которой генерирует пользовательский интерфейс сразу после (синхронно) вызова onDismissed. Допустим, у вас есть List<Item> _items в State вашего виджета, который хранит модель данных пользовательского интерфейса, которая заполняет список. Для того чтобы Dismissible работал, вы должны синхронно вызвать _items.remove(item) в вашем State при вызове onDismissed.

Итак, не делайте между ними await и непросто удалите элемент из хранилища, удалите его и из фактического State (я специально говорю вам об этом, потому что вижу, что вы делаете await shopListRepository.remove(event.product)).

...