flutter - 使用 Bloc 刷新 Flutter 中的对话框
问题描述
所以我试图从使用Bloc的DatePicker包中选择一个日期。showDialog
这是显示的代码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
对象的事件,该对象被发射到更新状态。
该事件将mapEventToState
触发 Bloc 中的方法,发出新状态,如果您将第一个对话框包装在BlocBuilder
如下所述的 a 中,它将显示更新日期
原答案:
假设您的setCheckInDate()
方法在您的 中发出新状态HotelChangeParamsBloc
,您只需将第一个对话框包装在
BlocBuilder<HotelChangeParamsBloc, HotelChangeParamsBlocState>
然后在其中显示更新的日期state.yourBlocVariable.toString()
如果没有BlocBuilder
任何东西告诉它重建,所以在你关闭并重建它之前它不会显示更新的状态。
推荐阅读
- python - 如何从另一个类返回条目值?
- python - Fabric 的 connection.forward_local 超出范围时失败
- visual-studio-code - 如何移动“查找”小部件
- javascript - 通过脚本从一个角度项目加载到另一个角度项目时面临问题
- elasticsearch - 使用 Java API 的 Elasticsearch 嵌套查询和 Rest API 查询有不同的响应
- google-analytics - 将谷歌分析数据添加到 Zoho CRM 潜在客户信息
- html - 如何在我的 HTML 文档中使用 FromArray 中的特定 FormControl?
- sqlite - 内部将一个表两次连接到另一个表 - sqlite
- php - 从浏览器直接文件夹访问访问 php 文件的内容
- ios - 如何以编程方式在 iOS 13 中隐藏和显示状态栏?