首页 > 解决方案 > 使用 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

标签: flutterdialogblocflutter-dialog

解决方案


编辑:如果您有兴趣遵守预期的 Bloc 模式,则不会从对话框中触发常规功能。这就是为什么我说'假设你正在发出一个新的状态'。

理想情况下会是

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

在该示例中,UserSelectedDateEvent是一个传递DateTime对象的事件,该对象被发射到更新状态。

该事件将mapEventToState触发 Bloc 中的方法,发出新状态,如果您将第一个对话框包装在BlocBuilder如下所述的 a 中,它将显示更新日期

原答案:

假设您的setCheckInDate()方法在您的 中发出新状态HotelChangeParamsBloc,您只需将第一个对话框包装在

BlocBuilder<HotelChangeParamsBloc, HotelChangeParamsBlocState>

然后在其中显示更新的日期state.yourBlocVariable.toString()

如果没有BlocBuilder任何东西告诉它重建,所以在你关闭并重建它之前它不会显示更新的状态。


推荐阅读