Обновление диалога во Flutter с помощью Bloc

Итак, я пытаюсь выбрать дату с помощью пакета DatePicker изнутри showDialogиспользуя Bloc.

Вот код, который показывает:

      onPressed: () {
   showDialog(
     context: context,
     barrierDismissible: true,
     child: _buildEditDialog(context, arguments),
   );
},

А вот содержание:

      void _openCalendarPicker(BuildContext context, SearchHotelArguments arguments) async {
    final DateTime dateTimeNow = DateTime.now();
    final List<DateTime> picked = await DateRagePicker.showDatePicker(
        context: context,
        initialFirstDate: arguments.checkInDate ?? dateTimeNow,
        initialLastDate: arguments.checkOutDate ?? dateTimeNow.add(Duration(days: 1)),
        firstDate: dateTimeNow,
        lastDate: dateTimeNow.add(Duration(days: 365 * 10)));
    if (picked != null && picked.length == 2) {
      context.read<HotelChangeParamsBloc>().setCheckInDate(picked[0]);
      context.read<HotelChangeParamsBloc>().setCheckOutDate(picked[1]);
    }
}

Теперь проблема заключается в том, что я открываю всплывающее окно с помощью, выбираю и отправляю его, но дата остается такой же, как и раньше. И если я закрою и снова открою, я вижу, что произошла смена даты. Итак Dialog не обновляет данные сами по себе (если я не открою его повторно).

Кто-нибудь знает, как я могу обновить диалог новым Date от DateRangePicker?

1 ответ

Изменить: если вы заинтересованы в соблюдении намеченного шаблона блока, вы не будете запускать обычную функцию из своего диалога. Вот почему я сказал «при условии, что вы испускаете новое состояние».

В идеале было бы

      context.read<HotelChangeParamsBloc>().add(UserSelectedDateEvent(setCheckInDate(picked[0])));

В этом примере UserSelectedDateEvent это событие, которое проходит в DateTime объект, который переходит в обновленное состояние.

Это событие ударит по mapEventToState в вашем Bloc, испустите новое состояние, и если вы заключите свой первый диалог в, как указано ниже, он покажет обновленную дату

Оригинальный ответ:

Предполагая, что ваш setCheckInDate() метод испускает новое состояние в вашем HotelChangeParamsBloc, вам просто нужно обернуть свой первый диалог в

      BlocBuilder<HotelChangeParamsBloc, HotelChangeParamsBlocState>

Затем внутри этого отобразите обновленную дату с помощью state.yourBlocVariable.toString()

Без BlocBuilder нет ничего, что говорит ему о перестройке, поэтому он не будет показывать обновленное состояние, пока вы не закроете и не восстановите его.

Другие вопросы по тегам