【问题标题】:FlutterBloc react to Blocs's initial stateFlutter Bloc 对 Blocs 初始状态的反应
【发布时间】:2021-02-12 13:18:18
【问题描述】:

我怎样才能让我的集团对集团的初始状态做出反应。在示例中,我试图在集团初始状态上记录一些内容,但没有任何反应。它只打印 blocs 构造函数,但不打印 facilityIntial 的打印语句


class FacilityBloc extends Bloc<FacilityEvent, FacilityState> {
  FacilityBloc(this.facilityRepository)
      : assert(facilityRepository != null),
        super(FacilityInitial()) {
    print('FacilitBlocConstructed');
  }

  final FacilityRepository facilityRepository;

  @override
  Stream<FacilityState> mapEventToState(
    FacilityEvent event,
  ) async* {
    print(event);
    if (event is FacilityGetAll) {
      yield* _mapGetAllFacilityToState(event);
    } else if (event is FacilityInitial) {
      print('Facility intial state');
    }
  }

  Stream<FacilityState> _mapGetAllFacilityToState(FacilityGetAll event) async* {
    yield FacilityLoading();
    try {
      List<Facility> facilities = await facilityRepository.loadAllFacility();
      yield FacilityLoaded(facilities);
    } on AppException catch (e) {
      yield FacilityError(e.exceptionMessageId);
    } catch (e) {
      yield FacilityError(LocaleKeys.generalError);
    }
  }
}

【问题讨论】:

    标签: flutter dart bloc flutter-provider flutter-bloc


    【解决方案1】:

    如果FacilityInitial 是一个状态,那么这就是您无法在mapEventToState 函数中对其做出反应的原因(在此函数中,您只能对事件做出反应,而不是对状态做出反应)。如果mapEventToState 是一个事件(我不能肯定,因为你没有提供该信息)它可能与同名的状态类冲突。

    此外,您还没有提供创建 bloc 实例的代码。为了能够对事件做出反应(即使是初始事件),您需要将此事件添加到 bloc。它可能看起来像这样:

    BlocProvider<FacilityBloc>(
        lazy: false,
        create: (context) => FacilityBloc(FacilityRepository())..add(FacilityInitialEvent()),
      child: Text("My Text"),
    )
    

    在上面的例子中,我明确地添加了FacilityInitialEvent,因此该集团能够处理它。另外,我稍微更改了事件名称,以避免名称冲突。

    【讨论】:

    • 天哪,我知道我的问题毫无意义,因为这是一个状态而不是一个事件,谢谢!
    猜你喜欢
    • 2021-02-22
    • 2021-04-17
    • 2021-02-10
    • 2021-03-19
    • 2020-05-06
    • 2020-02-21
    • 2020-12-09
    • 2021-07-21
    • 2020-07-09
    相关资源
    最近更新 更多