Я обернул свой 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()),
),
],
);
},
);
}