我正在尝试使用Provider
将我的屏幕页面嵌套为TabBarView
. 当我尝试使用
此提供程序为: Provider.of(context(.getSingleUser(( 进入父屏幕和此屏幕中TabBarView
上的一个页面一起出现错误:
此时,小部件的元素树的状态不再是 稳定。E/颤振 (21506(:在 它的 dispose(( 方法,通过调用来保存对祖先的引用 inheritFromWidgetOfExactType(( 在 widget 的 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 的父级中删除提供程序实现时,导致重新定义问题的原因
看起来您面临的问题与不再有效的上下文有关,并且根据provider
文档:
或者,我们可以不使用
Provider.of
,我们可以使用Consumer
和Selector
. 这些对于性能优化或难以获取提供程序的 BuildContext 后代非常有用
因此,将您的FutureBuilder
包装在Consumer
内,而不是使用Provider.of
:
Consumer<UserTableDao>(
builder: (_, dao, __) =>
FutureBuilder(
future: dao.getSingleUser(),
builder: (context, snapshot) {
...
如果要提供值而不是新构造的提供程序类型,请考虑使用Provider.value
构造函数。特别是如果您希望在其中一个提供的实例超出范围后不释放您的值。