diff --git a/README.md b/README.md index f4e9fb0..2add2a6 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,7 @@ CalendarViewWidget({@required this.calendarController, this.boxDecoration}); //构造函数 CalendarController( {int selectMode = Constants.MODE_SINGLE_SELECT, + int showMode = Constants.MODE_SHOW_ONLY_MONTH, bool expandStatus = true, DayWidgetBuilder dayWidgetBuilder = defaultCustomDayWidget, WeekBarItemWidgetBuilder weekBarItemWidgetBuilder = defaultWeekBarWidget, @@ -96,7 +97,8 @@ CalendarViewWidget({@required this.calendarController, this.boxDecoration}); 属性 | 含义 | 默认值 :-: | :-: | :-: -selectMode | 选择模式,表示单选或者多选 | 默认是单选MODE_SINGLE_SELECT +selectMode | 选择模式,表示单选或者多选 | 默认是单选
static const int MODE_SINGLE_SELECT = 1;
static const int MODE_MULTI_SELECT = 2; +showMode|展示模式| 默认是只展示月视图
static const int MODE_SHOW_ONLY_MONTH=1;//仅支持月视图
static const int MODE_SHOW_ONLY_WEEK=2;//仅支持星期视图
static const int MODE_SHOW_WEEK_AND_MONTH=3;//支持月和星期视图切换 minYear | 日历显示的最小年份| 1971 maxYear | 日历显示的最大年份| 2055 minYearMonth | 日历显示的最小年份的月份| 1 diff --git a/example/lib/custom_sign_page.dart b/example/lib/custom_sign_page.dart index 4f6717d..4ea59cb 100644 --- a/example/lib/custom_sign_page.dart +++ b/example/lib/custom_sign_page.dart @@ -139,6 +139,9 @@ class CustomStyleDayWidget extends BaseCombineDayWidget { @override Widget getNormalWidget(DateModel dateModel) { + if (!dateModel.isCurrentMonth) { + return Container(); + } return Container( margin: EdgeInsets.all(8), child: new Stack( @@ -186,6 +189,9 @@ class CustomStyleDayWidget extends BaseCombineDayWidget { @override Widget getSelectedWidget(DateModel dateModel) { + if (!dateModel.isCurrentMonth) { + return Container(); + } return Container( margin: EdgeInsets.all(8), foregroundDecoration: diff --git a/example/lib/custom_style_page.dart b/example/lib/custom_style_page.dart index fe5d9ad..711c058 100644 --- a/example/lib/custom_style_page.dart +++ b/example/lib/custom_style_page.dart @@ -112,6 +112,9 @@ class CustomStyleDayWidget extends BaseCustomDayWidget { @override void drawNormal(DateModel dateModel, Canvas canvas, Size size) { + if (!dateModel.isCurrentMonth) { + return; + } bool isWeekend = dateModel.isWeekend; bool isInRange = dateModel.isInRange; @@ -148,6 +151,9 @@ class CustomStyleDayWidget extends BaseCustomDayWidget { @override void drawSelected(DateModel dateModel, Canvas canvas, Size size) { + if (!dateModel.isCurrentMonth) { + return; + } //绘制背景 Paint backGroundPaint = new Paint() ..color = Colors.blue diff --git a/example/lib/default_style_page.dart b/example/lib/default_style_page.dart index 595fd0b..455782f 100644 --- a/example/lib/default_style_page.dart +++ b/example/lib/default_style_page.dart @@ -1,7 +1,5 @@ -import 'package:example/main.dart'; import 'package:flutter/material.dart'; import 'package:flutter_custom_calendar/flutter_custom_calendar.dart'; -import 'package:provider/provider.dart'; /** * 默认风格+单选 @@ -28,7 +26,8 @@ class _DefaultStylePageState extends State { minYear: now.year, minYearMonth: now.month - 2, maxYear: now.year, - maxYearMonth: now.month + 1); + maxYearMonth: now.month + 1, + showMode: Constants.MODE_SHOW_WEEK_AND_MONTH); controller.addMonthChangeListener( (year, month) { diff --git a/lib/cache_data.dart b/lib/cache_data.dart index eb48796..5362177 100644 --- a/lib/cache_data.dart +++ b/lib/cache_data.dart @@ -20,6 +20,14 @@ class CacheData { } return _instance; } + + + void clearData(){ + monthListCache.clear(); + weekListCache.clear(); + } + + } diff --git a/lib/calendar_provider.dart b/lib/calendar_provider.dart index 5ee04f2..9ad1a00 100644 --- a/lib/calendar_provider.dart +++ b/lib/calendar_provider.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_custom_calendar/cache_data.dart'; import 'package:flutter_custom_calendar/configuration.dart'; import 'package:flutter_custom_calendar/model/date_model.dart'; import 'package:flutter_custom_calendar/utils/LogUtil.dart'; @@ -97,19 +98,14 @@ class CalendarProvider extends ChangeNotifier { ? selectDateModel : DateModel.fromDateTime(DateTime.now()) ..day = 15; - -// expandStatus.addListener(() { -// print("1111"); -// if (expandStatus.value == false) { -// calendarConfiguration.weekController.jumpToPage(weekPageIndex); -// } -// }); } //退出的时候,清除数据 void clearData() { LogUtil.log(TAG: this.runtimeType, message: "CalendarProvider clearData"); + CacheData.instance.clearData(); selectedDateList.clear(); selectDateModel = null; + calendarConfiguration = null; } } diff --git a/lib/configuration.dart b/lib/configuration.dart index e2ca071..eeca2fc 100644 --- a/lib/configuration.dart +++ b/lib/configuration.dart @@ -12,9 +12,6 @@ class CalendarConfiguration { //仅展示月视图,仅展示周视图,支持月视图和周视图切换 int showMode; - bool defaultExpandStatus; //展开状态,true代表是月视图,false代表是周视图 - bool enableExpand; //是否可以展开,true只展示月视图,false仅展示周视图, - //日历显示的最小年份和最大年份 int minYear; int maxYear; @@ -90,14 +87,10 @@ class CalendarConfiguration { this.monthController, this.weekController, this.verticalSpacing, - this.itemSize, - this.enableExpand, - bool defaultExpandStatus}) { - this.defaultExpandStatus = defaultExpandStatus; - } + this.itemSize,this.showMode}); @override String toString() { - return 'CalendarConfiguration{selectMode: $selectMode, expandStatus: $defaultExpandStatus, minYear: $minYear, maxYear: $maxYear, minYearMonth: $minYearMonth, maxYearMonth: $maxYearMonth, nowYear: $nowYear, nowMonth: $nowMonth, minSelectYear: $minSelectYear, minSelectMonth: $minSelectMonth, minSelectDay: $minSelectDay, maxSelectYear: $maxSelectYear, maxSelectMonth: $maxSelectMonth, maxSelectDay: $maxSelectDay, defaultSelectedDateList: $defaultSelectedDateList, maxMultiSelectCount: $maxMultiSelectCount, extraDataMap: $extraDataMap, monthList: $monthList, weekList: $weekList, monthController: $monthController, weekController: $weekController}'; + return 'CalendarConfiguration{selectMode: $selectMode, minYear: $minYear, maxYear: $maxYear, minYearMonth: $minYearMonth, maxYearMonth: $maxYearMonth, nowYear: $nowYear, nowMonth: $nowMonth, minSelectYear: $minSelectYear, minSelectMonth: $minSelectMonth, minSelectDay: $minSelectDay, maxSelectYear: $maxSelectYear, maxSelectMonth: $maxSelectMonth, maxSelectDay: $maxSelectDay, defaultSelectedDateList: $defaultSelectedDateList, maxMultiSelectCount: $maxMultiSelectCount, extraDataMap: $extraDataMap, monthList: $monthList, weekList: $weekList, monthController: $monthController, weekController: $weekController}'; } } diff --git a/lib/constants/constants.dart b/lib/constants/constants.dart index 9af2d56..4042090 100644 --- a/lib/constants/constants.dart +++ b/lib/constants/constants.dart @@ -4,9 +4,11 @@ class Constants { static const int MODE_SINGLE_SELECT = 1; static const int MODE_MULTI_SELECT = 2; - //展开状态 - static const int STATUS_EXPAND=1;//展开 - static const int STATUS_SHRINK=2;//收缩 + //展示模式 + static const int MODE_SHOW_ONLY_MONTH=1;//仅支持月视图 + static const int MODE_SHOW_ONLY_WEEK=2;//仅支持星期视图 + static const int MODE_SHOW_WEEK_AND_MONTH=3;//支持月和星期视图切换 + /** * 一周七天 diff --git a/lib/controller.dart b/lib/controller.dart index 4ae9fab..fc4a984 100644 --- a/lib/controller.dart +++ b/lib/controller.dart @@ -32,7 +32,7 @@ class CalendarController { CalendarController( {int selectMode = Constants.MODE_SINGLE_SELECT, - bool expandStatus = true, + int showMode = Constants.MODE_SHOW_ONLY_MONTH, DayWidgetBuilder dayWidgetBuilder = defaultCustomDayWidget, WeekBarItemWidgetBuilder weekBarItemWidgetBuilder = defaultWeekBarWidget, int minYear = 1971, @@ -51,11 +51,12 @@ class CalendarController { DateModel selectDateModel, int maxMultiSelectCount = 9999, double verticalSpacing = 10, - bool enableExpand = true, + double itemSize, Map extraDataMap = EMPTY_MAP}) { LogUtil.log(TAG: this.runtimeType, message: "init CalendarConfiguration"); calendarConfiguration = CalendarConfiguration( selectMode: selectMode, + showMode: showMode, minYear: minYear, maxYear: maxYear, maxYearMonth: maxYearMonth, @@ -67,11 +68,10 @@ class CalendarController { minSelectDay: minSelectDay, maxSelectYear: maxSelectYear, maxSelectMonth: maxSelectMonth, - defaultExpandStatus: expandStatus, extraDataMap: extraDataMap, maxSelectDay: maxSelectDay, - enableExpand: enableExpand, - verticalSpacing: verticalSpacing); + verticalSpacing: verticalSpacing, + itemSize: itemSize); calendarConfiguration.dayWidgetBuilder = dayWidgetBuilder; calendarConfiguration.weekBarItemWidgetBuilder = weekBarItemWidgetBuilder; @@ -440,6 +440,14 @@ class CalendarController { DateModel getSingleSelectCalendar() { return calendarProvider.selectDateModel; } + + //清除数据 + void clearData(){ + monthList.clear(); + weekList.clear(); + calendarProvider.clearData(); + } + } /** diff --git a/lib/widget/calendar_view.dart b/lib/widget/calendar_view.dart index 14f1716..605340c 100644 --- a/lib/widget/calendar_view.dart +++ b/lib/widget/calendar_view.dart @@ -1,6 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_custom_calendar/calendar_provider.dart'; +import 'package:flutter_custom_calendar/constants/constants.dart'; import 'package:flutter_custom_calendar/controller.dart'; import 'package:flutter_custom_calendar/model/date_model.dart'; import 'package:flutter_custom_calendar/utils/LogUtil.dart'; @@ -39,6 +40,12 @@ class _CalendarViewWidgetState extends State { super.initState(); } + @override + void dispose() { + widget.calendarController.clearData(); + super.dispose(); + } + @override Widget build(BuildContext context) { return ChangeNotifierProvider.value( @@ -70,7 +77,7 @@ class CalendarContainerState extends State var state = CrossFadeState.showFirst; - List widgets; + List widgets = []; int index = 0; @@ -79,13 +86,21 @@ class CalendarContainerState extends State calendarProvider = Provider.of(context, listen: false); expand = calendarProvider.expandStatus.value; - widgets = [ - const MonthViewPager(), - const WeekViewPager(), - ]; + if (calendarProvider.calendarConfiguration.showMode == + Constants.MODE_SHOW_ONLY_WEEK) { + widgets.add(const WeekViewPager()); + } else if (calendarProvider.calendarConfiguration.showMode == + Constants.MODE_SHOW_WEEK_AND_MONTH) { + widgets.add(const MonthViewPager()); + widgets.add(const WeekViewPager()); + } else { + //默认是只显示月视图 + widgets.add(const MonthViewPager()); + } //如果需要视图切换的话,才需要添加监听,不然不需要监听变化 - if (calendarProvider.calendarConfiguration.enableExpand == true) { + if (calendarProvider.calendarConfiguration.showMode == + Constants.MODE_SHOW_WEEK_AND_MONTH) { calendarProvider.expandStatus.addListener(() { setState(() { expand = calendarProvider.expandStatus.value; diff --git a/lib/widget/month_view_pager.dart b/lib/widget/month_view_pager.dart index e6546e2..ca47e92 100644 --- a/lib/widget/month_view_pager.dart +++ b/lib/widget/month_view_pager.dart @@ -50,8 +50,6 @@ class _MonthViewPagerState extends State { // WidgetsBinding.instance.addPostFrameCallback((timeStamp) { // calendarProvider.calendarConfiguration.monthController.jumpToPage(index); // }); - - } @override @@ -69,15 +67,22 @@ class _MonthViewPagerState extends State { return PageView.builder( onPageChanged: (position) { + if (calendarProvider.expandStatus.value == false) { + return; + } //月份的变化 DateModel dateModel = configuration.monthList[position]; configuration.monthChange(dateModel.year, dateModel.month); //用来保存临时变量,用于月视图切换到周视图的时候,默认是显示中间的一周 - DateModel temp = new DateModel(); - temp.year = configuration.monthList[position].year; - temp.month = configuration.monthList[position].month; - temp.day = configuration.monthList[position].day + 14; - calendarProvider.lastClickDateModel = temp; + if (calendarProvider.lastClickDateModel != null || + calendarProvider.lastClickDateModel.month != dateModel.month) { + DateModel temp = new DateModel(); + temp.year = configuration.monthList[position].year; + temp.month = configuration.monthList[position].month; + temp.day = configuration.monthList[position].day + 14; + calendarProvider.lastClickDateModel = temp; + } + //计算下高度,使PageView自适应高度 // double itemHeight = MediaQuery.of(context).size.width / 7;