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

Flutter使用table_calendar热重启后报Null不是DateTime子类型错误

错误根因

你遇到的type 'Null' is not a subtype of type 'DateTime'错误核心原因是_CalenderState类中的selectedDay和focusedDay两个变量没有指定非空类型、也没有初始化默认值:

  • 热重载时不会重置State状态,只要你之前点击过日历给这两个变量赋过值,就不会触发空值错误
  • 热重启会完全重置应用状态,这两个变量回到初始的null值,后续所有期望接收DateTime类型的逻辑(日期匹配、事件查询、新增事件等)都会因为传入了null报错

修复步骤

1. 修正状态变量声明,添加默认初始值

找到_CalenderState类中的变量定义段,把

var focusedDay;
var selectedDay;

替换为:

// 指定非空DateTime类型,默认初始值为当前时间
DateTime focusedDay = DateTime.now();
DateTime selectedDay = DateTime.now();

2. 修正TableCalendar的focusedDay绑定

你当前的TableCalendar组件中focusedDay写死为DateTime.now(),不会响应状态更新,修改为绑定状态变量:

TableCalendar(
  // 替换原来的focusedDay: DateTime.now()
  focusedDay: focusedDay,
  firstDay: DateTime.utc(2010, 10, 16),
  lastDay: DateTime.utc(2030, 3, 14),
  // 其余参数保持不变
)

(可选)添加空值防护逻辑

如果后续有其他场景可能导致这两个变量为空,可以给关键逻辑加非空判断,避免崩溃:

  • 日期匹配逻辑修改:
selectedDayPredicate: (DateTime date) {
  return selectedDay != null && isSameDay(selectedDay!, date);
},
  • 事件查询逻辑修改:
..._getEventsfromDay(selectedDay ?? DateTime.now()).map((Event event) => ListTile(
  title: Text(event.title),
)),

验证效果

修改完成后执行热重启,默认会选中当前日期,不会再抛出空类型错误,日历切换、新增事件功能均可正常运行。

内容的提问来源于stack exchange,提问作者Venkitesh S.Anand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:36:06