Blo c дает нулевое значение при управлении несколькими состояниями - PullRequest
0 голосов
/ 01 мая 2020

Я обернул свой root виджет BlocProvider и использовал BlocBuilder для рисования моих виджетов в соответствии с состояниями ScreensControllerBlo c и использовал BlocProvider.of (context) .add (....) для изменения состояний blo c и первое состояние ScreenIndexState прекрасно работает внутри BlocBuilder, но SectionIndexState, однако, не работает, и когда я пытаюсь использовать state.sectionIndex внутри BlocBuilder, это дает мне нулевое значение! Пожалуйста, помогите, так как это реальный проект, и я не могу решить эту проблему

Редактировать: я добавил код, в котором я использовал BlocBuilder

, вот код

screen_controller_event. дарт

abstract class ScreensControllerEvent {}

class ChangeScreenIndexEvent extends ScreensControllerEvent {
  final int newScreenIndex;

  ChangeScreenIndexEvent({this.newScreenIndex});
}

class ChangeSectionIndexEvent extends ScreensControllerEvent {
  final int newSectionIndex;

  ChangeSectionIndexEvent({this.newSectionIndex});
}

Screen_Controller_state.dart

abstract class ScreensControllerState {
  int currentScreenIndex;
  int sectionsIndex;
}

class Uninitialized extends ScreensControllerState {
  Uninitialized._();

  factory Uninitialized.set() {
    return Uninitialized._()
      ..currentScreenIndex = 0
      ..sectionsIndex = 1;
  }
}

class ScreenIndexState extends ScreensControllerState {
  ScreenIndexState._();

  factory ScreenIndexState.change(int newIndex) {
    return ScreenIndexState._()..currentScreenIndex = newIndex;
  }
}

class SectionIndexState extends ScreensControllerState {
  SectionIndexState._();

  factory SectionIndexState.change(int newIndex) {
    return SectionIndexState._()..sectionsIndex = newIndex;
  }
}

Screen_Controller_blo c .. DART

class ScreensControllerBloc
    extends Bloc<ScreensControllerEvent, ScreensControllerState> {
  @override
  ScreensControllerState get initialState => Uninitialized.set();

  @override
  Stream<ScreensControllerState> mapEventToState(
    ScreensControllerEvent event,
  ) async* {
    if (event is ChangeScreenIndexEvent) {
      yield* _mapScreenIndexChangeToState(event.newScreenIndex);
    } else if (event is ChangeSectionIndexEvent) {
      yield* _mapSectionIndexChangeToState(event.newSectionIndex);
    }
  }

  Stream<ScreensControllerState> _mapScreenIndexChangeToState(
    int newIndex,
  ) async* {
    yield ScreenIndexState.change(newIndex);
  }

  Stream<ScreensControllerState> _mapSectionIndexChangeToState(
    int newIndex,
  ) async* {
    yield SectionIndexState.change(newIndex);
  }
}

на главной странице экрана это работает:

class _MainScreenState extends State<MainScreen> {
  final userAccountAdmin = CustomerAccountAdmin.instance;
  ScreensControllerBloc screensControllerBloc = ScreensControllerBloc();

  @override
  Widget build(BuildContext context) {
    screensControllerBloc = BlocProvider.of<ScreensControllerBloc>(context);
    return BlocBuilder<ScreensControllerBloc, ScreensControllerState>(
      builder: (context, state) => SafeArea(
        child: Directionality(
          textDirection: TextDirection.rtl,
          child: Scaffold(
            resizeToAvoidBottomPadding: false,
            appBar: buildAppBar(state.screenIndex),//state.screenIndex works here
            body: buildCurrentScreen(state.screenIndex),
            bottomNavigationBar: BottomNavigationBar(.....),
        ),
       ),
      ),
    );
  }
}

однако на этой странице state.sectionIndex не работает

class _SectionsState extends State<Sections> {
  @override
  Widget build(BuildContext context) {
    final deviceWidth = MediaQuery.of(context).size.width;
    return BlocBuilder<ScreensControllerBloc, ScreensControllerState>(
      builder: (context, state) {
        return Row(
          children: <Widget>[
            Container(
              width: deviceWidth / 3,
              child: Column(
                  children: sections[state.sectionIndex].map((section) {
                return Container(...),
                    color: section.color,
                    onPressed: () {
                      setState(() {
                        for (int i = 0;
                            i < sections[state.sectionIndex].length;
                            i++) {
                          sections[state.sectionIndex][i].color =
                              Color(0xffdddddd);
                        }
                        section.color = Colors.white;
                      });
                    },
                  ),
                );
              }).toList()),
            ),
          ],
        );
      },
    );
  }
...