在小部件的嵌套部分中使用 Provider 并出现 dispose() 错误

Posted

技术标签:

【中文标题】在小部件的嵌套部分中使用 Provider 并出现 dispose() 错误【英文标题】:using Provider in nested part of widgets and getting dispose() error 【发布时间】:2020-01-10 08:19:44 【问题描述】:

我正在尝试使用Provider 将我的屏幕页面嵌套为TabBarView。当我尝试使用

此提供者为: Provider.of(context).getSingleUser() 一起进入父屏幕和TabBarView 上的一页在这个屏幕上我得到错误:

此时小部件的元素树的状态不再是 稳定的。 E/flutter (21506):安全地引用小部件的祖先 它的 dispose() 方法,通过调用保存对祖先的引用 inheritFromWidgetOfExactType() 在小部件的 didChangeDependencies() 方法。

在主函数中我定义了这个提供者:

...  
MultiProvider(providers: [
  Provider(builder: (_) => database),
  Provider(builder: (_) => database.userTableDao),
  Provider(builder: (_) => settings),
] ...  ,

进入register_navigator.dart 我有TabBarView 和两个孩子

FutureBuilder(
    future: Provider.of<UserTableDao>(context).getSingleUser(),
    builder: (context, snapshot) 
      if (snapshot.connectionState == ConnectionState.done) 
        UserTableData user = snapshot.data;
        ...
        TabBarView( ... ),
      

      ...
),

然后我使用了这个TabBarView 的孩子

FutureBuilder(
    future: Provider.of<UserTableDao>(context).getSingleUser(),

再次

当我从 TabBarView 的父级删除提供者实现时,会导致问题解决

【问题讨论】:

您是否在此流程的某个点调用了 push? 我的意思是,您正在导航到任何路线吗? 你能提供标签持有者和标签视图的完整代码吗? 让我们continue this discussion in chat。 【参考方案1】:

看起来您面临的问题与不再有效的上下文有关,并且根据provider 文档:

我们可以使用ConsumerSelector 来替代使用Provider.of。 这些对于性能优化或难以获得提供者的 BuildContext 后代时很有用

所以,将您的 FutureBuilder 包裹在 Consumer 中,而不是使用 Provider.of

Consumer<UserTableDao>(
  builder: (_, dao, __) => 
    FutureBuilder(
      future: dao.getSingleUser(),
      builder: (context, snapshot) 
    ...

【讨论】:

@DolDurma 我的回答值得赏金吗? 你能帮我用Provider.of&lt;&gt;.value()代替Consumer吗?谢谢 这取决于您的应用程序是如何构建的以及您如何向前传递上下文。为什么要避开消费者? 我想知道如何使用Provider.of&lt;&gt;.value()实现它【参考方案2】:

如果您提供的是值而不是新构造的 Provider 类型,请考虑使用 Provider.value 构造函数。特别是如果您希望在提供的实例之一超出范围后不处置您的值。

【讨论】:

那不是价值。我正在提供数据库类和类函数,正因为如此。我不明白我该如何解决这个问题 我建议你尝试一下,看看它的作用。 你的新意思是在提供者中不使用构建器我应该使用价值吗? 是的。使用 .value 名称构造函数并将您想要提供的值传递给它 我不确定,因为这是具有一些功能方法的类。我想和他们一起上课

以上是关于在小部件的嵌套部分中使用 Provider 并出现 dispose() 错误的主要内容,如果未能解决你的问题,请参考以下文章

在小部件中打开一个活动

小部件未出现在小部件列表中

Wordpress小部件正在管理区域中消失

如何迭代对象列表并使用颤振在小部件中获取它们的属性?

QWebview 未显示在小部件框上

在多个屏幕中使用表单颤振“在小部件树中检测到重复的 GlobalKey”错误