Как установить два разных списка при загрузке (начальной) страницы по шаблону Blo C в флаттере - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть два списка для DropDownList в моей форме, я использую шаблон Blo C, я даю 4 состояния для одного события в требовании_ blo c .dart страница.

  @override
  Stream<DemandAddState> mapEventToState(DemandAddEvent event) async* {
    if (event is InitListLoadEvent) {
      yield* _setInitListToState(event);
    }
  }

  Stream<DemandAddState> _setInitListToState(InitListLoadEvent event) async* {
    yield InitListLoading();
    try {

      List data = await demandAddRepository.getEmployeeList();
      yield EmployeeListLoaded(data: data);

      List data2 = await demandAddRepository.getDayOffList();
      yield DayOffListLoaded(data2: data2);

    } catch (_) {
      yield InitListError();
    }
  }

мое требование_ state.dart равно

class InitListLoading extends DemandAddState {}

class InitListError extends DemandAddState {}

class EmployeeListLoaded extends DemandAddState {
  final List data;

  const EmployeeListLoaded({@required this.data}) : assert(data != null);

}

class DayOffListLoaded extends DemandAddState {
  final List data2;

  const DayOffListLoaded({@required this.data2}) : assert(data2 != null);

}

после и по моему требованию_ page.dart ,

Мне нужно дать data , data2 ,

, но, к сожалению, данные обнулились.

    body: BlocProvider<DemandAddBloc>(
      create: (context) {
        return DemandAddBloc(demandAddRepository: demandAddRepository)
          ..add(InitListLoadEvent());
      },
      child: BlocBuilder<DemandAddBloc, DemandAddState>(
        builder: (context, demandAddState) {
          if (demandAddState is InitListLoading) {
            return LoadingIndicator();
          }
          if (demandAddState is DayOffListLoaded) {
            data2 = demandAddState.data2;
          }
          if (demandAddState is EmployeeListLoaded) {
            data = demandAddState.data;
          }

          if (demandAddState is InitListError){ ... }


          return ...
          ListView(
              children: <Widget>[
                Form(
                  key: _formKey,
                  child: Column(

                    children: [

                       _buildDropDownFormField(data),

                       _buildDropDownFormField(data2),

                        ....

Я потерял данные после конец процесса

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Это потому, что BLo C имеет только 1 состояние за раз. Что вы можете сделать, это либо создать отдельный BLo C для обработки обоих состояний, либо создать новый класс состояний.

class ListLoaded extends DemandAddState {
   final List<Employee> data;
   final List<DayOff> data2;
}
    body: BlocProvider<DemandAddBloc>(
      create: (context) {
        return DemandAddBloc(demandAddRepository: demandAddRepository)
          ..add(InitListLoadEvent());
      },
      child: BlocBuilder<DemandAddBloc, DemandAddState>(
        builder: (context, demandAddState) {
          if (demandAddState is InitListLoading) {
            return LoadingIndicator();
          }
          if (demandAddState is ListLoaded) {
            data = demandAddState.data;
            data2 = demandAddState.data2;

            return ...
            ListView(
                children: <Widget>[
                  Form(
                    key: _formKey,
                    child: Column(
                      children: [
                         _buildDropDownFormField(data),
                         _buildDropDownFormField(data2),
                       ....
          }
          if (demandAddState is InitListError){
            return ..
          }
0 голосов
/ 24 февраля 2020

Я изменил свой _state.dart

class InitListLoading extends DemandAddState {}

class InitListError extends DemandAddState {}

class InitListLoaded extends DemandAddState {
  final List data;
  final List data2;

  const InitListLoaded({@required this.data,  @required this.data2}) : assert(data != null, data2 != null);
}

и мой _page.dart

          ...
          if (demandAddState is InitListLoaded) {
            dataDayOffList = demandAddState.data2;
            dataEmployeeList = demandAddState.data;
          }
          ...
...