Получение значения из наблюдаемого из родительского виджета в дочерний - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть какой-то 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,
    )
  }
),
...