在处理方法中获取提供程序方法不起作用

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(),
  ),