我正在尝试访问 dispose 函数中的提供者方法。
@override
void dispose() {
if (canRemoveData) Provider.of<MyProvider>(context, listen: false).clearData();
super.dispose();
}
但是当它被调用时我收到错误:
完成小部件树时抛出以下断言:
查找已停用小部件的祖先是不安全的。
此时widget的元素树的状态不再是
稳定的。
我做错了什么以及如何解决它?
错误描述基本上说明了一切。这dispose()
方法旨在处理您的小部件的状态依赖项和控制器,因此此时您不应该尝试查找此小部件的祖先,因为您的小部件已从小部件树中删除。
相反,您应该在您的状态中创建一个变量并提供MyProvider
值在initState()
。然后您就可以从 dispose 中调用 MyProvider#clearData() ,如下所示:
class _MyWidgetState extends State<MyWidget> {
MyProvider _myProvider;
@override
void initState() {
super.initState();
_myProvider = Provider.of<MyProvider>(context, listen: false);
}
@override
void dispose() {
if (canRemoveData) _myProvider.clearData();
super.dispose();
}
@override
Widget build(BuildContext context) {
// implement
}
}
此外,如果您提供 MyProvider 作为小部件的直接父级,并且在处置后您在其他任何地方都不需要 MyProvider,则可以使用 ProxyProvider dispose 方法,如下所示:
ProxyProvider<SomeDependency, MyProvider>(
update: (context, someDependency, previous) => previous ?? MyProvider(someDependency),
dispose: (context, myProvider) => myProvider.clearData(),
),
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)