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

如何在Flutter中使用timepicker组件实现开始与结束时间的选择及单独更新

问题原因

你目前所有时间选择组件都共用同一个_currentTime状态变量存储选中值,所以不管点击哪个时间选择框,修改的都是同一个值,自然无法实现两个字段的独立更新。

解决方案

你需要拆分状态变量,同时调整方法的传参逻辑,修改后代码如下:
首先替换原来的单一时间状态变量:

// 拆分两个变量分别存储开始时间和结束时间,初始值可按需求设置
TimeOfDay _startTime = TimeOfDay.now();
TimeOfDay _endTime = TimeOfDay.now();

调整时间选择函数逻辑:

Future<Null> selectedTime(BuildContext context, bool isStartTime) async{
  TimeOfDay? _pickedTime = await showTimePicker(
    context: context,
    // 初始值根据选择的时间类型取对应变量
    initialTime: isStartTime ? _startTime : _endTime
  );
  if (_pickedTime != null){
    setState(() {
      // 根据标识更新对应时间变量
      if(isStartTime) {
        _startTime = _pickedTime;
      } else {
        _endTime = _pickedTime;
      }
      print("选中的时间为: $_pickedTime");
    });
  }
}

调整组件构建函数,新增当前展示时间的入参:

Widget _buildTimePick(String title, bool isStartTime, TimeOfDay showTime){
  return Row(
    children: [
      Container(
        width: 80,
        child: Text(
          title,
          style: AppStyles.textTitle,
        ),
      ),
      Container(
        padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 5),
        decoration: BoxDecoration(
          border: Border.all(color: MyColors.borderColor),
          borderRadius: BorderRadius.circular(20),
        ),
        child: GestureDetector(
          child: Text(
            "${showTime.format(context)}",
            style: AppStyles.textBody,
          ),
          onTap: () {
            selectedTime(context, isStartTime);
          },
        ),
      ),
    ],
  );
}

调用示例:

// 生成开始时间选择器
_buildTimePick("开始时间", true, _startTime),
// 生成结束时间选择器
_buildTimePick("结束时间", false, _endTime)

如果需要额外校验结束时间不早于开始时间,只需要在selectedTime函数的setState逻辑前加对应判断即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:06:01