在处理方法中获取提供程序方法不起作用
Get a provider method in the dispose method not working
我正在尝试访问处置函数中的提供程序方法。
@override
void dispose() {
if (canRemoveData) Provider.of<MyProvider>(context, listen: false).clearData();
super.dispose();
}
但是当它被调用时我得到错误:
The following assertion was thrown while finalizing the widget tree:
Looking up a deactivated widget's ancestor is unsafe.
At this point the state of the widget's element tree is no longer
stable.
我做错了什么,我该如何解决?
错误描述基本上已经说明了一切。 dispose()
方法旨在处理您的小部件的状态依赖项和控制器,因此此时您不应尝试查找此小部件的祖先,因为您的小部件已从小部件树中删除。
您应该改为在您的州创建一个变量,并在 initState()
中提供 MyProvider
值。然后你就可以这样调用 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(),
),
我正在尝试访问处置函数中的提供程序方法。
@override
void dispose() {
if (canRemoveData) Provider.of<MyProvider>(context, listen: false).clearData();
super.dispose();
}
但是当它被调用时我得到错误:
The following assertion was thrown while finalizing the widget tree: Looking up a deactivated widget's ancestor is unsafe.
At this point the state of the widget's element tree is no longer stable.
我做错了什么,我该如何解决?
错误描述基本上已经说明了一切。 dispose()
方法旨在处理您的小部件的状态依赖项和控制器,因此此时您不应尝试查找此小部件的祖先,因为您的小部件已从小部件树中删除。
您应该改为在您的州创建一个变量,并在 initState()
中提供 MyProvider
值。然后你就可以这样调用 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(),
),