【问题标题】:using Provider in nested part of widgets and getting dispose() error在小部件的嵌套部分中使用 Provider 并出现 dispose() 错误
【发布时间】: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?
  • 我的意思是,您正在导航到任何路线吗?
  • 你能提供标签持有者和标签视图的完整代码吗?

标签: flutter


【解决方案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 名称构造函数并将您想要提供的值传递给它
  • 我不确定,因为这是具有一些功能方法的类。我想和他们一起上课
猜你喜欢
  • 2020-08-08
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
  • 2012-07-25
  • 1970-01-01
  • 2017-09-23
  • 2021-06-18
相关资源
最近更新 更多