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

2024-03-07

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

@override
void dispose() {
  if (canRemoveData) Provider.of<MyProvider>(context, listen: false).clearData();
  super.dispose();
}

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

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

此时widget的元素树的状态不再是 稳定的。

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


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

此外,如果您提供 MyProvider 作为小部件的直接父级,并且在处置后您在其他任何地方都不需要 MyProvider,则可以使用 ProxyProvider dispose 方法,如下所示:

ProxyProvider<SomeDependency, MyProvider>(
    update: (context, someDependency, previous) => previous ?? MyProvider(someDependency),
    dispose: (context, myProvider) => myProvider.clearData(),
  ),
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 dispose 方法中获取提供者方法不起作用 的相关文章

随机推荐

  • 使用 SQL 对列表排序还是作为集合排序?

    我的数据库中有一些带有日期的条目 什么是最好的 用sql语句获取它们并应用order by 使用 sql 获取列表 并在应用程序中对它们进行排序collection sort or so Thanks 这是一个非常广泛的问题 很难回答 这在
  • Rust 进程使用 GitHub 操作失败,退出代码为 101

    该代码在我的本地计算机上运行良好并且没有给出任何错误 但是当我推送到 GitHub 时 构建失败了 这是我的工作流程文件的块 runs on matrix platform steps name Checkout Repository us
  • Delphi 多索引通用列表

    我正在寻找一种 TList 后代 它可以让我添加一个或多个索引 并让我通过这些索引进行搜索和查看 30分钟的谷歌搜索让我一无所获 以前肯定需要这个 我的意思是 有多少次您有一个内存索引集合 然后需要以不同的顺序显示它 Thanks AJ 你
  • 事件与路由器绑定

    我在用着导航网 https github com krasimir navigo对于一个小网站 用户被要求登录到登陆页面上的帐户 然后在验证其帐户后路由到主模板 页面对象是从 Firebase 数据库填充的 因此我初始化一个类并将多个事件和
  • 是否可以在 Sublime Text 2 中链接键绑定命令?

    有时 我想在 Sublime Text 中显示侧栏中的当前文件 然后在文件夹结构中导航 这可以使用命令来实现reveal in side bar and focus side bar然而 它们必须绑定到两个单独的按键组合 因此我必须执行 2
  • 在 SQL Server 中将月份名称转换为月份编号

    在 T SQL 中 将月份名称转换为数字的最佳方法是什么 E g January gt 1 February gt 2 March gt 3 Etc 是否有任何内置函数可以做到这一点 这个怎么样 select DATEPART MM jan
  • 如何用新列覆盖 Spark 数据框中的整个现有列?

    我想用一个新列覆盖 Spark 列 该新列是二进制标志 我尝试直接覆盖 id2 列 但为什么它不像 Pandas 中的就地操作那样工作 如何在不使用 withcolumn 创建新列和 drop 删除旧列的情况下做到这一点 我知道 Spark
  • ASP.NET Core 5.0 RouteDataRequestCultureProvider 删除 url 中的默认区域性

    我尝试向我的 asp net core 项目添加多语言功能 但 RequestLocalization 中的 net 3 1 和 5 0 之间存在一些变化 我无法得到我想要的 我为每种语言添加了资源文件 并在我的剃刀页面中使用了资源 它可以
  • Windeployqt 不会为调试应用程序部署 qwindowsd.dll

    我正在尝试使用windeployqt exe Qt 5 13 2 为 CMake 3 16 生成的调试应用程序部署 dll 除了部署的平台插件 dll 之外 所有 dll 均已正确部署qwindows dll代替qwindowsd dll当
  • 系统verilog中的打包向量与未打包向量

    看看我在 System Verilog 中维护的一些代码 我看到一些信号的定义如下 node range hi range lo x 以及其他定义如下 node y range hi range lo 我明白那个x被定义为打包的 而y被定义
  • 对特定行禁用 StyleCop

    我们在 C 项目中使用 StyleCop 但在某些情况下 我们希望避免这些规则 我知道你可以添加
  • 阻止自动化工具访问网站

    我们网站上的数据很容易被窃取 我们如何检测是否有人正在查看网站或工具 一种方法是计算用户在页面上停留的时间 我不知道如何实施 任何人都可以帮助检测并防止自动化工具从我的网站上抓取数据吗 我在登录部分使用了安全图像 但即使如此 人们也可以登录
  • 包 org.springframework.data.repository 不存在 spring boot jpa

    我对 spring boot jpa 有一个小问题 我已将依赖项添加到 POM xml 我可以从 spring 工具套件正常运行它 作为 spring boot 应用程序运行 但是当我从命令行 mvn spring boot run 运行时
  • C++11 中没有“sto{short, unsigned Short}”函数吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 完全奇怪的 Firefox CSS bug

    我从事前端开发很长时间了 以前从未遇到过这样的错误 将以下 HTML 保存到文件并在 Firefox 中查看 我的是 3 6 3 h2 Some normal text strong some bold text strong weird
  • XSLT - 作为一系列节点的参数

    我的目标是将多个文件的名称传递到 XSLT 中并使用document myFile 我试图使用 saxon 引擎在命令行上传递参数 但它不断抛出错误 我知道我可以写出一个清单文件 对其进行处理 然后在完成后将其删除 但这似乎需要大量额外工作
  • 如何检查名称是否已经存在? Azure 资源管理器模板

    是否有可能check 在 ARM 模板中 如果我的虚拟机名称已存在 我正在为 Azure 市场开发解决方案模板 也许可以在其中设置一个参数用户界面定义 uniqe 目标是重现这个绿色钩子 一些注释 VM 名称只需在资源组内唯一 而无需在订阅
  • 如何将编译结果(使用javac)存储到文本文件中?

    我想编译一个Hello World程序 我用javac Hello World java 但是在cmd终端窗口中 它显示 semicolon is missing compilation error 如何将此编译错误存储到文本文件中 或者甚
  • R ggplot:如何将点与躲避条对齐?

    我想知道如何将 geom point 点与 geom bar 躲避条位置对齐 根据年份参数对条形进行躲避 但无论年份参数如何 点都绘制在躲避条形的中间 可重现的代码 set seed 42 dat lt data frame Respons
  • 在 dispose 方法中获取提供者方法不起作用

    我正在尝试访问 dispose 函数中的提供者方法 override void dispose if canRemoveData Provider of