У меня есть какой-то ParentWidget , который вызывается с помощью showModalBottomSheet.Он также обернут наследником InheritedWidget (BlocProvider), чтобы предоставить дочерним элементам ParentWidget доступ к Bloc.Дата, отображаемая в ChildWidget1 , может быть изменена каким-либо образом (см. Виджет InkWell).Затем я переключаюсь на ChildWidget2 (ChildWidget1 уничтожен) и ожидаю увидеть дату, которая изменяется на ChildPage1, как выбранную дату в виджете календаря ChildPage2, но значение bloc.someDateValue пусто.
Я пытался сделать
bloc.changeDate(...)
, когда переключился на второй виджет, но это не помогло.
Пожалуйста, помогите, как заставить дату отправляться другимдочерний виджет?
Инициатор:
showModalBottomSheet(context: context, builder: (context) {
return BlocProvider<ParentBloc>(
child: ParentWidget(),
bloc: ParentBloc(),
);
});
BLoC:
class ParentBloc {
final _dateSubject = BehaviourSubject<DateTime>();
Observable<DateTime> get someDate => _dateSubject.stream;
DateTime get someDateValue => _dateSubject.value;
Function(DateTime) get changeDate => _dateSubject.add;
}
ParentWidget:
//.. somewhere in `build`
...
StreaBuilder<DateTime>(
stream: bloc.someDate, // <-- target date
builder: (context, snapshot) {
Text(snapshot.data),
}
),
...
CoupertinoSegmentControl(
children: {
0, 'Child 1',
1, 'Child 2',
},
onValueChanged: (value) {
setState() {
childIndex = value;
}
},
...
)
...
Container(
child: childIndex == 0 ? ChildWidget1() : ChildWidget2(),
)
ChildWidget 1:
DateTime calcDate() {
return someCalculatedDate;
}
// .. somewhere in `build`
final bloc = BlocProvider.of<ParentBloc>(context);
...
InkWell(
onTap: () => bloc.changeDate(calcDate()); // send date to stream
)
Детский виджет 2:
// ... somewhere in `build`
StreamBuilder(
initialData: bloc.someDateValue, // <-- latest changed date is expected
stream: bloc.someDate,
builder: (context, snapshot) {
CalendarCarousel(
selectedDateTime: snapshot.data,
)
}
),