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

时间:2019-09-08 04:34:08

标签: flutter

我正在尝试使用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的父级中删除提供者的实现时,该问题的解决原因

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

  

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

因此,将FutureBuilder包裹在Consumer中,而不要使用Provider.of

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