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
相关产品推荐
相关产品推荐

