在小部件的嵌套部分中使用 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
文档:
我们可以使用
Consumer
和Selector
来替代使用Provider.of
。 这些对于性能优化或难以获得提供者的 BuildContext 后代时很有用
所以,将您的 FutureBuilder
包裹在 Consumer
中,而不是使用 Provider.of
:
Consumer<UserTableDao>(
builder: (_, dao, __) =>
FutureBuilder(
future: dao.getSingleUser(),
builder: (context, snapshot)
...
【讨论】:
@DolDurma 我的回答值得赏金吗? 你能帮我用Provider.of<>.value()
代替Consumer
吗?谢谢
这取决于您的应用程序是如何构建的以及您如何向前传递上下文。为什么要避开消费者?
我想知道如何使用Provider.of<>.value()
实现它【参考方案2】:
如果您提供的是值而不是新构造的 Provider 类型,请考虑使用 Provider.value
构造函数。特别是如果您希望在提供的实例之一超出范围后不处置您的值。
【讨论】:
那不是价值。我正在提供数据库类和类函数,正因为如此。我不明白我该如何解决这个问题 我建议你尝试一下,看看它的作用。 你的新意思是在提供者中不使用构建器我应该使用价值吗? 是的。使用 .value 名称构造函数并将您想要提供的值传递给它 我不确定,因为这是具有一些功能方法的类。我想和他们一起上课以上是关于在小部件的嵌套部分中使用 Provider 并出现 dispose() 错误的主要内容,如果未能解决你的问题,请参考以下文章