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

Flutter日期时间选择器点击不弹出问题求助

问题排查与修复方案

核心问题1:InkWell的onTap未正确触发回调

在DateTimeWidget的InkWell中,你写的是:

onTap: () =>onTap,

这只是返回了onTap函数对象,并没有执行它。正确的写法应该直接传递函数引用:

onTap: onTap,

核心问题2:showTimePicker的异步处理错误

showTimePicker返回的是Future<TimeOfDay?>,你直接强制转换为TimeOfDay且未用await等待结果,这会导致类型错误,同时无法正确获取选择的时间。修正如下:

final TimeOfDay? getTime = await showTimePicker(context: context, initialTime: TimeOfDay.now());

需要加上await,并且使用可空类型TimeOfDay?,因为用户可能取消选择。


修正后的DateTimeWidget代码

class DateTimeWidget extends StatelessWidget {
  const DateTimeWidget({
    super.key,
    required this.titleText,
    required this.valueText,
    required this.iconSection,
    required this.onTap,
  });

  final String titleText;
  final String valueText;
  final IconData iconSection;
  final VoidCallback onTap;

  @override
  Widget build(BuildContext context) {
    return Expanded(
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Text(titleText, style: AppStyle.headingOne),
          const Gap(6),
          Material(
            child: Ink(
              decoration: BoxDecoration(
                color: Colors.grey.shade200,
                borderRadius: BorderRadius.circular(10),
              ),
              child: InkWell(
                splashColor: Colors.amber,
                borderRadius: BorderRadius.circular(10),
                onTap: onTap, // 修复回调触发问题
                child: Container(
                  padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12),
                  decoration: BoxDecoration(
                    color: Colors.transparent,
                    borderRadius: BorderRadius.circular(8),
                  ),
                  child: Row(children: [
                    Icon(iconSection),
                    const Gap(6),
                    Text(valueText),
                  ]),
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

修正后的时间选择回调代码

DateTimeWidget(titleText: 'Time',
  valueText: ref.watch(timeProvider),
  iconSection: CupertinoIcons.clock,
  onTap: () async {
    // 修复异步处理与类型问题
    final TimeOfDay? getTime = await showTimePicker(context: context, initialTime: TimeOfDay.now());

    if(getTime != null) {
      ref.read(timeProvider.notifier).update((state) => getTime.format(context));
    }
  },
),

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:12:40