You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter如何将当日日期设为DropdownButton下拉框的默认值

解决方案:DropdownButton初始默认展示当日日期

核心调整分3部分,完全不破坏原有选择逻辑,同时解决初始值显示问题:

  • 初始化阶段就生成格式化后的当日日期,作为下拉初始状态的展示值,同时页面加载时自动执行原有选「Today」时的日期存储、可预约时段查询逻辑
  • 用selectedItemBuilder自定义下拉按钮选中态的展示内容,避免出现「DropdownButton的value不在items列表中」的报错
  • 调整选项选中后的赋值逻辑,选「Today」时展示当日日期,选日历选项后展示用户选中的日期

具体代码修改

1. 调整状态变量与初始化逻辑

把原来写死的dropdownvalue = 'Today'替换为初始化时生成的当日格式化日期,在initState中完成初始化和首屏逻辑执行:

// 引入intl包(你原有代码已经使用DateFormat,这步可跳过)
import 'package:intl/intl.dart';

// 状态变量定义
late String formattedToday; // 存储格式化后的当日日期
late String dropdownvalue;
// 下拉选项保持原有定义不变
var items = [
  'Today',
  'Choose from calendar',
];
// 存储当前选中的日期,默认是当日
DateTime currentDateTime = DateTime.now();

@override
void initState() {
  super.initState();
  // 初始化当日日期,格式和原有逻辑保持一致
  formattedToday = DateFormat('dd-MM-yyyy').format(currentDateTime);
  // 下拉初始值先设为'Today',保证和items列表值匹配不报错
  dropdownvalue = 'Today';

  // 首屏加载完成后执行原有Today选项的业务逻辑
  WidgetsBinding.instance.addPostFrameCallback((_) {
    final storeProvider = Provider.of<StorageProvider>(context, listen: false);
    storeProvider.updateAppointmentDate(formattedToday);
    final slotBookingProvider = Provider.of<SlotBookingProvider>(context, listen: false);
    slotBookingProvider.checkAvailableSlot(date: formattedToday, context: context);
  });
}

2. 修改DropdownButton组件代码

新增selectedItemBuilder自定义选中态展示内容,调整onChanged逻辑适配日期展示:

DropdownButton(
  underline: Container(),
  isExpanded: true,
  value: dropdownvalue,
  icon: const Icon(
    Icons.keyboard_arrow_down,
    color: Color(0xffB50000),
  ),
  // 下拉选项保持原有逻辑不变
  items: items.map((String item) {
    return DropdownMenuItem(
      value: item,
      child: Text(
        item,
        style: TextStyle(
            color: Color(0xffB50000),
            fontWeight: FontWeight.w400),
      ),
    );
  }).toList(),
  // 自定义选中后在按钮上展示的内容,核心实现初始显示日期的需求
  selectedItemBuilder: (BuildContext context) {
    return items.map((String item) {
      // 默认展示当日日期
      String displayText = formattedToday;
      // 如果选了日历选项,展示日历选中的格式化日期
      if (dropdownvalue == 'Choose from calendar') {
        displayText = DateFormat('dd-MM-yyyy').format(currentDateTime);
      }
      return Text(
        displayText,
        style: TextStyle(
            color: Color(0xffB50000),
            fontWeight: FontWeight.w400),
      );
    }).toList();
  },
  onChanged: (String? newValue) {
    if (newValue == null) return;
    setState(() {
      dropdownvalue = newValue;
    });

    if(dropdownvalue =='Choose from calendar'){
      // 唤起日期选择器,等待用户选择结果
      _selectedDate(context).then((selectedDate) {
        if (selectedDate != null) {
          setState(() {
            currentDateTime = selectedDate;
          });
          String selectedFormatted = DateFormat('dd-MM-yyyy').format(selectedDate);
          final storeProvider = Provider.of<StorageProvider>(context, listen: false);
          storeProvider.updateAppointmentDate(selectedFormatted);
          final slotBookingProvider = Provider.of<SlotBookingProvider>(context, listen: false);
          slotBookingProvider.checkAvailableSlot(date: selectedFormatted, context: context);
        }
      });
    }
    if(dropdownvalue =='Today'){
      setState(() {
        currentDateTime = DateTime.now();
      });
      String today = DateFormat('dd-MM-yyyy').format(currentDateTime);
      final storeProvider = Provider.of<StorageProvider>(context, listen: false);
      storeProvider.updateAppointmentDate(today);
      final slotBookingProvider = Provider.of<SlotBookingProvider>(context, listen: false);
      slotBookingProvider.checkAvailableSlot(date: today, context: context);
    }
  },
)

3. 适配日期选择器方法

确保你的_selectedDate方法能返回选中的DateTime对象,如果原来没有返回值,参考如下调整:

Future<DateTime?> _selectedDate(BuildContext context) async {
  return await showDatePicker(
    context: context,
    initialDate: currentDateTime,
    firstDate: DateTime(2024),
    lastDate: DateTime(2030),
    // 其他日期选择器配置保持你原有设置即可
  );
}

改完后效果:页面首次加载时下拉按钮直接显示当日格式化日期,下拉展开的选项还是原来的「Today」「Choose from calendar」两个,选Today自动切回当日日期,选日历自动展示选中的日期,原有业务逻辑完全不受影响。

内容的提问来源于stack exchange,提问作者Tuhin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 08:54:19