You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动