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

Dart类实例变量未初始化?赋值后列表长度仍为0问题排查求助

问题原因及解决方案

你遇到的问题分为两种场景,对应不同的修复方案:

场景1:print(_events.length)直接输出0

你的代码中_events列表初始化时已经写入了1个元素,正常情况下打印长度必然为1。如果输出0,说明你调用getEventsForDay方法的EventsProvider实例和你预期的不是同一个对象:

  • 你大概率在代码中多处使用EventsProvider()新建了实例,不同实例的私有列表_events互相独立,你赋值的是A实例,调用方法的是新创建的B实例,B实例的列表没有额外写入过元素就会输出0。
  • 修复方案:全局维护同一个EventsProvider实例,可通过单例模式实现,避免重复创建新对象。

场景2:_events.length打印为1,但getEventsForDay返回的列表长度为0

这是DartDateTime类型的相等判断逻辑导致的:

  • DateTime的==运算符会同时比较年、月、日、时、分、秒、毫秒、微秒所有字段,你初始化Event时传入的DateTime(2021, 9, 15)默认时分秒都是0,如果你调用getEventsForDay时传入的day参数包含非0的时分秒字段,就会判断为两个日期不相等,过滤后的列表自然为空。
  • 修复方案:自定义只比较年月日的日期判断方法,替换原有的相等判断逻辑:
// 工具方法:判断两个日期是否为同一天
bool isSameDay(DateTime date1, DateTime date2) {
  return date1.year == date2.year 
      && date1.month == date2.month 
      && date1.day == date2.day;
}

// 修改getEventsForDay方法逻辑
List<Event> getEventsForDay(DateTime day) {
  print(_events.length);
  return _events.where((event) => isSameDay(event.day, day)).toList();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:54:01