FlutterBloc对Blocs的初始状态做出反应

时间:2020-10-30 03:16:56

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

如何使我的集团对集团的初始状态做出反应。在该示例中,im尝试在块的初始状态上记录一些内容,但没有任何反应。它只打印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);
    }
  }
}

1 个答案:

答案 0 :(得分:1)

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

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

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

在上面的示例中,我显式添加了FacilityInitialEvent,因此可以对它进行处理。另外,为了避免名称冲突,我对事件名称做了一些更改。