在dispose()方法内部调用带有Provider.of(context)的方法会导致“查找已停用的小部件的祖先是不安全的。”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在dispose()方法内部调用带有Provider.of(context)的方法会导致“查找已停用的小部件的祖先是不安全的。”相关的知识,希望对你有一定的参考价值。

当我尝试在State的dispose方法内部调用如下方法时。

  @override
  void dispose() 
    Provider.of<AppProvider>(context, listen: false).close();
    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.

To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.

When the exception was thrown, this was the stack
#0      Element._debugCheckStateIsActiveForAncestorLookup.<anonymous closure> 
package:flutter/…/widgets/framework.dart:3508
#1      Element._debugCheckStateIsActiveForAncestorLookup 
package:flutter/…/widgets/framework.dart:3522
#2      Element.getElementForInheritedWidgetOfExactType 
package:flutter/…/widgets/framework.dart:3588
#3      Provider.of 
package:provider/src/provider.dart:219
#4      _MySecondPageState.dispose 
package:test_space/main.dart:138
...

我不确定如何执行此操作To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.我目前正在使用provider: ^4.0.2

我以前也一样,在dispose()中使用Provider.of(context),但之前没有此异常。这是因为新的Flutter版本吗?另外,我意识到这里有deactivate()方法,我应该使用deactivate()方法而不是dispose()方法吗?

答案

似乎您正在尝试关闭AppProvider类中定义的内容。如果AppProvider类扩展了ChangeNotifier,则更改通知程序类提供了dispose方法,您可以重写它,然后仅在AppProvider类内调用close函数。

以上是关于在dispose()方法内部调用带有Provider.of(context)的方法会导致“查找已停用的小部件的祖先是不安全的。”的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter 中,方法 'dispose' 被调用为 null

在 Form.Dispose() 方法中安全调用

更改“ReproClass”上的 Dispose 方法以在此字段上调用 ​​Dispose 或 Close

我应该为流对象调用 Close() 或 Dispose() 吗?

当传递到另一个对象时,谁应该在 IDisposable 对象上调用 Dispose?

WCF 服务中的 NinjectServiceHost 不调用 Dispose()