Flutter日期选择器能否选择日期后直接关闭,无需点击确认按钮?
让Flutter日期选择器选中日期后立即关闭
当然可以实现类似jQuery日期选择器的效果!默认的showDatePicker需要用户选完日期后点击「确定」按钮才会关闭,如果你想点击日期就直接关闭弹窗并确认选择,这里有两种可行方案:
方案一:自定义原生日期选择对话框
我们可以直接使用Flutter原生的DatePickerDialog组件,自己监听日期选中事件,一旦用户选择日期就立即关闭对话框并返回结果:
Future<void> _selectDate(BuildContext context) async { DateTime? pickedDate; await showDialog( context: context, builder: (context) { return DatePickerDialog( initialDate: selectedDate, firstDate: DateTime(2015, 8), lastDate: DateTime(2101), onDateSelected: (date) { pickedDate = date; Navigator.of(context).pop(); // 选中日期后立即关闭对话框 }, ); }, ); if (pickedDate != null && pickedDate != selectedDate) { setState(() { selectedDate = pickedDate!; selectedDateF = "${selectedDate.toLocal()}".split(' ')[0]; }); } }
这个方案完全基于Flutter原生组件,不需要依赖第三方库,onDateSelected回调会在用户点击任意可选日期时触发,我们在回调里直接关闭弹窗并记录选中的日期。
方案二:使用第三方日期选择库
如果觉得自定义对话框太繁琐,可以选择成熟的第三方库,这类库大多支持选中日期后自动关闭的配置。以flutter_datetime_picker为例(需要先在pubspec.yaml中添加依赖):
// 先在pubspec.yaml添加依赖:flutter_datetime_picker: ^1.5.1 import 'package:flutter_datetime_picker/flutter_datetime_picker.dart'; Future<void> _selectDate(BuildContext context) async { DatePicker.showDatePicker( context, showTitleActions: true, minTime: DateTime(2015, 8), maxTime: DateTime(2101), onConfirm: (date) { setState(() { selectedDate = date; selectedDateF = "${selectedDate.toLocal()}".split(' ')[0]; }); }, currentTime: selectedDate, locale: LocaleType.en, ); }
这个库默认选中日期后点击确认会关闭弹窗,你也可以通过配置让它在选中日期时直接触发确认逻辑(具体可参考库的官方文档)。
另外补充:如果你之前用showDatePicker时遇到选中日期不关闭的情况,大概率是代码逻辑的特殊处理或版本问题,默认的showDatePicker在用户点击「确定」按钮后是会自动关闭弹窗的。
内容的提问来源于stack exchange,提问作者Exyu Portal




