使用 Bloc 在 Flutter 中刷新对话框

问题描述

所以我尝试使用 DatePickershowDialog 中选择一个带有 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 就没有任何东西告诉它重建,所以在您关闭并重建它之前它不会显示更新的状态。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...