如何解决问题:"A dismissed Dismissible widget is still part of the tree" while use Bloc

How to resolve issue: "A dismissed Dismissible widget is still part of the tree" while use Bloc

在实施 Dismissible 小部件时,我在删除项目时出错。

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

Parent 这个 child 看起来像

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

我将它移动到 parent 并使用 blocProvider 删除了 shopItem.removeAt() 但我仍然遇到了这个问题。 即使我使用列表中的 remove 删除了 object,它也会显示相同的错误消息:

    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 是由 uuid.v1() 生成的 '64b7ff60-f782-11e9-a3e8-a9ee0aa87ea5'。

我认为问题在于您没有删除列表生成 UI 的数据模型(同步) onDismissed 被调用。假设您的小部件 State 中有一个 List<Item> _items,它存储填充列表的 UI 数据模型。为了使 Dismissible 工作,您必须做的是在调用 onDismissed 时同步调用 State 中的 _items.remove(item)

所以,不要 await 介于两者之间,也不要简单地从存储库中删除项目,也不要从实际的 State 中删除它(我特意告诉你这个,因为我可以看到你正在做 await shopListRepository.remove(event.product)).