如何解决使用 Bloc 在 Flutter 中刷新对话框
所以我尝试使用 DatePicker 从 showDialog
中选择一个带有 Bloc 包的日期。
这是显示 Dialog
的代码:
onPressed: () {
showDialog(
context: context,barrierDismissible: true,child: _buildEditDialog(context,arguments),);
},
这是Dialog
的内容:
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
我打开一个带有 DateRangePicker
的弹出窗口,选择 Date
并提交,但在 Dialog
日期保持不变和以前一样。如果我关闭并重新打开 Dialog
,我可以看到日期发生了变化。所以 Dialog
不会自行刷新数据(除非我重新打开它)。
有谁知道我如何使用来自 Date
的新 DateRangePicker
刷新对话框?
解决方法
编辑: 如果您有兴趣遵守预期的 Bloc 模式,您就不会从对话框中触发常规函数。这就是为什么我说“假设你正在发出一个新状态”。
最好是
context.read<HotelChangeParamsBloc>().add(UserSelectedDateEvent(setCheckInDate(picked[0])));
在该示例中,UserSelectedDateEvent
是一个传入 DateTime
对象的事件,该对象被发射到更新状态。
该事件会触发您的 Bloc 中的 mapEventToState
方法,发出一个新状态,如果您将第一个对话框包装在 BlocBuilder
中,如下所述,它将显示更新日期
原答案:
假设您的 setCheckInDate()
方法在您的 HotelChangeParamsBloc
中发出一个新状态,您只需要将第一个对话框包装在
BlocBuilder<HotelChangeParamsBloc,HotelChangeParamsBlocState>
然后在其中,用 state.yourBlocVariable.toString()
没有 BlocBuilder
就没有任何东西告诉它重建,所以在您关闭并重建它之前它不会显示更新的状态。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。