我正在尝试使用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的父级中删除提供者的实现时,该问题的解决原因
答案 0 :(得分:1)
如果要提供值而不是新构造的Provider类型,请考虑使用Provider.value
构造函数。尤其是如果您希望在提供的实例之一超出范围后不处置您的价值。
答案 1 :(得分:1)
看起来您面临的问题与不再有效的上下文有关,并且根据provider
文档:
或者,我们可以使用
Provider.of
和Consumer
来代替Selector
。 这些对于性能优化或在难以获得提供程序的BuildContext后代时很有用
因此,将FutureBuilder
包裹在Consumer
中,而不要使用Provider.of
:
Consumer<UserTableDao>(
builder: (_, dao, __) =>
FutureBuilder(
future: dao.getSingleUser(),
builder: (context, snapshot) {
...