[英]Flutter Bloc Stream Listen not listening to state change
我有两个需要相互通信的块( WorkOrderBloc 和 FilterBottomSheetBloc )。
MultiBloc 提供程序我配置了一个 MultiBloc 提供程序,我通过其构造函数将 WorkOrderBloc 传递给 FilterSheetBottomBloc。
@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider<HomeBloc>(
create: (context) => HomeBloc(
authenticationBloc: BlocProvider.of<AuthenticationBloc>(context)),
),
BlocProvider<WorkOrderBloc>(
create: (context) => WorkOrderBloc(),
),
BlocProvider<FilterBottomSheetBloc>(
create: (context) => FilterBottomSheetBloc(
workOrderBloc: BlocProvider.of<WorkOrderBloc>(context)),
),
],
child: Scaffold(
appBar: AppBar(
actions: [
EndDrawerIcon(),
],
title: Text(_appBarTitle,
style: Theme.of(context).textTheme.headline5),
backgroundColor: Theme.of(context).colorScheme.secondary,
leadingWidth: 0,
centerTitle: false,
),
endDrawer: HomePageDrawer(),
body: Container(child: pages.elementAt(_currentIndex)),
bottomNavigationBar: HomePageBottomNavigation(
index: _currentIndex,
onTap: _switchPage,
)),
);
}
}
在 FilterBottomSheeBloc 中,我订阅了 WorkOrderBloc 流并监听从 WorkOrderBloc 发出的更改
FilterBottomSheetBloc
class FilterBottomSheetBloc extends Bloc<FilterBottomSheetBlocEvent,FilterBottomSheetBlocState> {
final WorkOrderBloc workOrderBloc;
late StreamSubscription workOrderBlocSubscription;
FilterBottomSheetBloc({required this.workOrderBloc})
: super(FilterBottomSheetBlocState()) {
workOrderBlocSubscription = workOrderBloc.stream.listen((state) {
print('--- WorkOrderBloc state changed ---');
if (state.status == WorkOrderStatus.success)
add(GetListOfWorkOrders(state.listOfWorkOrders));
});
on<GetListOfWorkOrders>((event, emit) {
emit(state.copyWith(listOfWorkOrders: event.listOfWorkOrders));
});
}
我的 WorkOrderBloc 发出的WorkOrderStatus.loading和 WorkOrderStatus.success 都很好,我可以使用 onChange 函数跟踪更改,但由于某种原因, FilterBottomSheetBloc中的 workOrderBloc.stream.listen 没有响应来自 WorkOrderBloc 的更改。
工单集团
class WorkOrderBloc extends Bloc<WorkOrderEvent, WorkOderState> {
final _workOrderRepository = locator.get<WorkOrderRepository>();
WorkOrderBloc()
: super(WorkOderState(
status: WorkOrderStatus.inital,
listOfWorkOrders: [],
filterOptions: FilterOptions(listOfWorkOrderStatusTypes: []))) {
on<getWorkOrders>((event, emit) async {
try {
emit(state.copyWith(status: WorkOrderStatus.loading));
List<WorkOrder> workOrders = await _workOrderRepository.getWorkOrders();
emit(state.copyWith(
status: WorkOrderStatus.success, listOfWorkOrders: workOrders));
} catch (e) {
print(e);
emit(state.copyWith(
status: WorkOrderStatus.failure,
failedMessage: 'Could not load your work orders'));
}
});
关于为什么这不起作用的任何建议?
Bloc 类默认是“惰性的”。 这意味着在您使用它们之前它们不会被初始化。 因此,您应该至少使用一个 BlocBuilder 来初始化它们,或者在提供 bloc 类时简单地使用lazy: false
参数。
BlocProvider<WorkOrderBloc>(
create: (context) => WorkOrderBloc(),
lazy: false,
),
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.