Обновление диалога во 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
нет ничего, что говорит ему о перестройке, поэтому он не будет показывать обновленное состояние, пока вы не закроете и не восстановите его.