使用不包含类型为的Blob的上下文调用Flutter BLoC BlocProvider.of()



与此线程类似,到目前为止还没有相关的解决方案。

我得到以下错误:

BlocProvider.of() called with a context that does not contain a Bloc of type CategoryBloc.

唯一的小工具:

class _TestWidgetState extends State<TestWidget> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Test')),
body: BlocProvider(
builder: (context) => sl<CategoryBloc>(),   // dependency injection via GetIt
child: Column(
children: [
BlocBuilder<CategoryBloc, CategoryState>(builder: (context, state) {
if (state is Empty) {
return Text('Empty');
}
if (state is Loading) {
return Text('Loading');
}
if (state is Loaded) {
return Text('Loaded');
}
}),
RaisedButton(
child: Text('Press me'),
onPressed: () {
dispatchAction(context);
},
),
],
),
),
);
}
void dispatchAction(BuildContext context) {
BlocProvider.of<CategoryBloc>(context).dispatch(GetAllCategories());
}
}

通过GetIt进行依赖注入

sl.registerFactory(() => CategoryBloc(getAllCategories: sl()));
...

为了完整起见,我将提供所有集团文件

类别Blob

class CategoryBloc extends Bloc<CategoryEvent, CategoryState> {
final GetAllCategoriesUsecase getAllCategories;
CategoryBloc({@required this.getAllCategories})
: assert(getAllCategories != null);
@override
CategoryState get initialState => Empty();
@override
Stream<CategoryState> mapEventToState(CategoryEvent event) async* {
if (event is GetAllCategories) {
yield Loading();
final failureOrCategories =
await getAllCategories(Params(limit: 10, skip: 0));
yield failureOrCategories.fold(
(failure) => Error(error: _mapFailureToMessage(failure)),
(categories) => Loaded(list: categories));
}
}
String _mapFailureToMessage(Failure failure) {
...
}
}

类别事件

@immutable
abstract class CategoryEvent extends Equatable {
CategoryEvent([List props = const <dynamic>[]]) : super();
}
class GetAllCategories extends CategoryEvent {
@override
List<Object> get props => [];
}

类别状态

@immutable
abstract class CategoryState extends Equatable {
CategoryState([List props = const <dynamic>[]]) : super();
@override
List<Object> get props => [];
}
class Empty extends CategoryState {}
class Loading extends CategoryState {}
class Loaded extends CategoryState {
final List<Category> list;
Loaded({@required this.list});
@override
List<Object> get props => [list];
}
class Error extends CategoryState {
final String error;
Error({@required this.error});
@override
List<Object> get props => [error];
}

pubspec.yaml

get_it: ^3.0.1
flutter_bloc: ^0.21.0   # old version :(
equatable: ^1.0.1

到目前为止,我已经尝试过:

  • 指定类型body: BlocProvider<CategoryBloc>(-相同错误

我们非常感谢您的帮助。

经过数小时的谷歌搜索找到了答案。

Flutter_bloc要求BlocProviderBlocBuilder位于单独的小部件中,以便BlocBuilder的上下文在层次结构上"位于"Builder的上下文之下。

class _TestWidgetState extends State<TestWidget> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Test')),
body: BlocProvider<CategoryBloc>(
builder: (context) => sl<CategoryBloc>(), //
child: TestWidget2(),
),
);
}
}
class TestWidget2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: [
BlocBuilder<CategoryBloc, CategoryState>(builder: (context, state) {
if (state is Empty) {
return Text('Empty');
}
if (state is Loading) {
return Text('Loading');
}
if (state is Loaded) {
return Text('Loaded');
}
}),
RaisedButton(
child: Text('Press me'),
onPressed: () {
dispatchAction(context);
},
),
],
);
}

最新更新