在小部件的嵌套部分使用提供程序并得到 dispose() 错误



我正在尝试使用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,我们可以使用ConsumerSelector. 这些对于性能优化或难以获取提供程序的 BuildContext 后代非常有用

因此,将您的FutureBuilder包装在Consumer内,而不是使用Provider.of

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

如果要提供值而不是新构造的提供程序类型,请考虑使用Provider.value构造函数。特别是如果您希望在其中一个提供的实例超出范围后不释放您的值。

最新更新