Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 在dispose方法中获取提供程序方法无效_Flutter_Dart_Flutter Provider - Fatal编程技术网

Flutter 在dispose方法中获取提供程序方法无效

Flutter 在dispose方法中获取提供程序方法无效,flutter,dart,flutter-provider,Flutter,Dart,Flutter Provider,我正在尝试访问dispose函数中的提供程序方法 @override void dispose() { if (canRemoveData) Provider.of<MyProvider>(context, listen: false).clearData(); super.dispose(); } @覆盖 无效处置(){ if(canRemoveData)Provider.of(context,listen:false).clearData(); super.dispos

我正在尝试访问dispose函数中的提供程序方法

@override
void dispose() {
  if (canRemoveData) Provider.of<MyProvider>(context, listen: false).clearData();
  super.dispose();
}
@覆盖
无效处置(){
if(canRemoveData)Provider.of(context,listen:false).clearData();
super.dispose();
}
但是当它被调用时,我得到了一个错误:

完成小部件树时引发了以下断言: 查找停用小部件的祖先是不安全的

此时,小部件的元素树的状态不再是 马厩


我做错了什么?如何修复它?

错误描述基本上说明了一切。
dispose()
方法用于处理小部件的状态依赖项和控制器,因此此时不应尝试查找此小部件的祖先,因为您的小部件已从小部件树中删除

您应该在您的状态中创建一个变量,并在
initState()
中提供
MyProvider
值。然后您可以从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
  }
}
class\u MyWidgetState扩展状态{
MyProvider\u MyProvider;
@凌驾
void initState(){
super.initState();
_myProvider=Provider.of(上下文,listen:false);
}
@凌驾
无效处置(){
if(canRemoveData)_myProvider.clearData();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
//实施
}
}
此外,如果您将MyProvider作为小部件的直接父级提供,并且在其dispose后,您将不需要MyProvider在其他任何地方,您可以使用ProxyProvider dispose方法,如下所示:

ProxyProvider<SomeDependency, MyProvider>(
    update: (context, someDependency, previous) => previous ?? MyProvider(someDependency),
    dispose: (context, myProvider) => myProvider.clearData(),
  ),
ProxyProvider(
更新:(上下文,someDependency,previous)=>previous??MyProvider(someDependency),
dispose:(上下文,myProvider)=>myProvider.clearData(),
),