import 'package:flutter_custom_calendar/utils/date_util.dart'; import 'package:flutter_custom_calendar/utils/lunar_util.dart'; /** * 日期的实体类 */ class DateModel { int year; int month; int day = 1; List lunar = List(3); // List get lunar { // if (lunar?.isNotEmpty == false) { // return lunar; // } //// return LunarUtil.solarToLunar(year, month, day); // } //农历字符串 String get lunarString { if (solarTerm.isNotEmpty) { return solarTerm; } else if (gregorianFestival.isNotEmpty) { return gregorianFestival; } else if (traditionFestival.isNotEmpty) { return traditionFestival; } else { return LunarUtil.numToChinese(lunar[1], lunar[2], lunar[3]); } } //24节气 String get solarTerm => LunarUtil.getSolarTerm(year, month, day); //公历节日 String get gregorianFestival { String result = LunarUtil.gregorianFestival(month, day); if (result?.isNotEmpty == true) { return result; } return LunarUtil.getSpecialFestival(year, month, day); } //传统农历节日 String get traditionFestival => LunarUtil.getTraditionFestival(year, month, day); bool isCurrentMonth; //是否是当前月份 Object extraData; //自定义的额外数据 bool isInRange = false; //是否在范围内,比如可以实现在某个范围外,设置置灰的功能 bool isSelected; //是否被选中,用来实现一些标记或者选择功能 bool isCanClick = true; //todo:是否可点击:设置范围外的日历不可点击,或者可以通过自定义拦截点击事件来设置true或者false //是否是周末 bool get isWeekend => DateUtil.isWeekend(getDateTime()); //是否是闰年 bool get isLeapYear => DateUtil.isLeapYear(year); //是否是今天 bool get isCurrentDay => DateUtil.isCurrentDay(year, month, day); int get lunarYear => lunar[0]; int get lunarMonth => lunar[1]; int get lunarDay => lunar[2]; @override String toString() { return 'DateModel{year: $year, month: $month, day: $day}'; } //如果是闰月,则返回闰月 //转化成DateTime格式 DateTime getDateTime() { return new DateTime(year, month, day); } //根据DateTime创建对应的model,并初始化农历和传统节日等信息 static DateModel fromDateTime(DateTime dateTime) { DateModel dateModel = new DateModel() ..year = dateTime.year ..month = dateTime.month ..day = dateTime.day; List lunar = LunarUtil.solarToLunar(dateModel.year, dateModel.month, dateModel.day); dateModel.lunar = lunar; // 将数据的初始化放到各个get方法里面进行操作,类似懒加载,不然很浪费 // LunarUtil.setupLunarCalendar(dateModel); return dateModel; } @override bool operator ==(Object other) => identical(this, other) || other is DateModel && runtimeType == other.runtimeType && year == other.year && month == other.month && day == other.day; @override int get hashCode => year.hashCode ^ month.hashCode ^ day.hashCode; //是否是同一天 bool isSameWith(DateModel dateModel) { return year == dateModel.year && month == dateModel.month && day == dateModel.day; } //是否在某天之后 bool isAfter(DateModel dateModel) { return this.getDateTime().isAfter(dateModel.getDateTime()); } //是否在某天之前 bool isBefore(DateModel dateModel) { return this.getDateTime().isBefore(dateModel.getDateTime()); } } class X { var _y; get y => null == _y ? initY() : _y; initY() { //do some computation _y = "result"; } }