Вы используете 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(),
),
);
}
При этом достаточно создать поставщика, а затем сразу же почитать поставщика. Поставщики предназначены для извлечения вещей дальше по дереву виджетов, а не для непосредственных потомков. В этом случае использование провайдера является излишним, и на самом деле нет никаких оснований не просто указывать блоку c поле вашего класса и ссылаться на него напрямую.