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

