@override
Widget build(BuildContext context) {
return BlocProvider<HomeBloc>(
create: (context) {
return HomeBloc(homeRepo: HomeRepository());
},
child: BlocProvider.of<HomeBloc>(context).state is HomeStateLoading
? CircularProgressIndicator()
: Container());
}
我对错误感到困惑:
BlocProvider.of() called with a context that does not contain a Bloc of type HomeBloc.
No ancestor could be found starting from the context that was passed to
BlocProvider.of<HomeBloc>().
我不只是在其直接父级创建
HomeBloc
吗?要什么 最佳答案
您正在使用传递到小部件类的context
方法中的build
来查找父BlocProvider
。但是,就您的小部件类而言,上下文是小部件树。因此,您的BlocProvider.of
正在寻找作为小部件类父级的BlocProvider
。如果要获取作为直接父级的提供者,则需要一个新的context
对象,其中BlocProvider
是小部件树中的祖先。最简单的方法是使用Builder
小部件:
@override
Widget build(BuildContext context) {
return BlocProvider<HomeBloc>(
create: (context) {
return HomeBloc(homeRepo: HomeRepository());
},
child: Builder(
builder: (newContext) => BlocProvider.of<HomeBloc>(newContext).state is HomeStateLoading
? CircularProgressIndicator()
: Container(),
),
);
}
话虽如此,创建一个提供程序然后立即尊敬该提供程序是非常多余的。提供者用于在小部件树的下方检索内容,通常不用于直接后代。在这种情况下,使用提供程序是过大的,实际上没有任何理由不只是让bloc成为您的类的一个字段并直接引用它。
关于flutter - Dart Provider:在直子上不可用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59723597/