如何解决问题:"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)
).
在实施 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)
).