繁体   English   中英

Flutter Bloc Stream Listen 不监听状态变化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM