Я делаю приложение с несколькими BLoC. Один из них, AuthBloc
, может быть извлечен из любой точки дерева, потому что это родительский элемент MaterialApp
, и он отлично работает.
Это не относится к любым другим реализованным мной BLoC. В этих случаях BLo C кажется доступным только для прямого потомка BLo C.
Поставщики BLoC реализованы следующим образом:
abstract class BaseBlocProvider extends InheritedWidget {
BaseBlocProvider({Key key, Widget child}) : super(key: key, child: child);
@override
bool updateShouldNotify(_) => true;
}
class CardsBlocProvider extends BaseBlocProvider {
final bloc = CardsBloc();
CardsBlocProvider({Key key, Widget child}) : super(key: key, child: child);
static CardsBloc of(BuildContext context) {
final provider =
context.dependOnInheritedWidgetOfExactType<CardsBlocProvider>();
return provider.bloc;
}
}
Конечно, AuthBloc
реализован таким же образом, и я тоже создаю экземпляр любого BLo C:
GivenBlocProvider(
child: ChildWidget(),
);
Я заметил два различия между AuthBloc
и другими BLoC (которые, как я думал, не не имеет значения, но я объясню, что у меня есть весь контекст): * У одного из них был виджет StatelessWidget между виджетами в дереве (BlocProvider > StatefulWidgetAbleToGetTheBloc > StatelessWidget > StatefulWidgetThatTriesToGetThatBloc
) * Два других раскрывают дерево из списка, чего я не делаю думаю, что это вообще должно быть важно, потому что у ребенка, который пытается получить доступ к родителю, должен быть BLo C в качестве предка (в соответствии с инструментами dart dev, он делает).
Способ получения BLoC в виджетах есть следующее, которое работает для AuthBloc
в любом виджете и для других BLoC в прямых потомках.
@override
void didChangeDependencies() {
super.didChangeDependencies();
_bloc = AuthBlocProvider.of(context);
}
Есть идеи, почему это происходит?