Jes*_*ica 2 dart flutter flutter-provider
我正在尝试访问 dispose 函数中的提供者方法。
@override
void dispose() {
if (canRemoveData) Provider.of<MyProvider>(context, listen: false).clearData();
super.dispose();
}
Run Code Online (Sandbox Code Playgroud)
但是当它被调用时我收到错误:
在完成小部件树时抛出以下断言:查找已停用小部件的祖先是不安全的。
此时小部件的元素树的状态不再稳定。
我做错了什么以及如何解决它?
错误描述基本上说明了一切。该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
}
}
Run Code Online (Sandbox Code Playgroud)
此外,如果您提供 MyProvider 作为小部件的直接父级,并且在处置后您在其他任何地方都不需要 MyProvider,则可以使用 ProxyProvider dispose 方法,如下所示:
ProxyProvider<SomeDependency, MyProvider>(
update: (context, someDependency, previous) => previous ?? MyProvider(someDependency),
dispose: (context, myProvider) => myProvider.clearData(),
),
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3253 次 |
最近记录: |