在 dispose 方法中获取提供者方法不起作用

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)

但是当它被调用时我收到错误:

在完成小部件树时抛出以下断言:查找已停用小部件的祖先是不安全的。

此时小部件的元素树的状态不再稳定。

我做错了什么以及如何解决它?

Ale*_*kov 5

错误描述基本上说明了一切。该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)