diff --git a/lib/CalendarProvider.dart b/lib/CalendarProvider.dart new file mode 100644 index 0000000..30db4be --- /dev/null +++ b/lib/CalendarProvider.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_custom_calendar/configuration.dart'; +import 'package:flutter_custom_calendar/model/date_model.dart'; + +/** + * 引入provider的状态管理,保存一些临时信息 + * + * 目前的情况:只需要获取状态,不需要监听rebuild + */ +class CalendarProvider extends ChangeNotifier { + Set selectedDateList = new Set(); //被选中的日期,用于多选 + DateModel _selectDateModel; //当前选中的日期,用于单选 + + DateModel get selectDateModel => _selectDateModel; + + set selectDateModel(DateModel value) { + _selectDateModel = value; + print("notifyListeners:$value"); + notifyListeners(); + } + + //配置类也放这里吧,这样的话,所有子树,都可以拿到配置的信息 + CalendarConfiguration calendarConfiguration; + + void initData( + {Set selectedDateList, + DateModel selectDateModel, + CalendarConfiguration calendarConfiguration}) { + print("CalendarProvider init"); + if (selectedDateList != null) { + this.selectedDateList.addAll(selectedDateList); + } + this.selectDateModel = selectDateModel; + this.calendarConfiguration = calendarConfiguration; + } + + //退出的时候,清除数据 + void clearData() { + print("CalendarProvider clearData"); + selectedDateList.clear(); + selectDateModel = null; + } +} diff --git a/lib/configuration.dart b/lib/configuration.dart new file mode 100644 index 0000000..2a191a0 --- /dev/null +++ b/lib/configuration.dart @@ -0,0 +1,88 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_custom_calendar/controller.dart'; +import 'package:flutter_custom_calendar/model/date_model.dart'; + +/** + * 配置信息类 + */ +class CalendarConfiguration { + //默认是单选,可以配置为MODE_SINGLE_SELECT,MODE_MULTI_SELECT + int selectMode; + + //展开状态 + bool expandStatus; + + //日历显示的最小年份和最大年份 + int minYear; + int maxYear; + + //日历显示的最小年份的月份,最大年份的月份 + int minYearMonth; + int maxYearMonth; + + //日历显示的当前的年份和月份 + int nowYear; + int nowMonth; + + //可操作的范围设置,比如点击选择 + int minSelectYear; + int minSelectMonth; + int minSelectDay; + + int maxSelectYear; + int maxSelectMonth; + int maxSelectDay; //注意:不能超过对应月份的总天数 + + Set defaultSelectedDateList = new Set(); //默认被选中的日期 + int maxMultiSelectCount; //多选,最多选多少个 + Map extraDataMap = new Map(); //自定义额外的数据 + + /** + * UI绘制相关的配置 + */ + //各种事件回调 + OnMonthChange monthChange; //月份切换事件 + OnCalendarSelect calendarSelect; //点击选择事件 + OnMultiSelectOutOfRange multiSelectOutOfRange; //多选超出指定范围 + OnMultiSelectOutOfSize multiSelectOutOfSize; //多选超出限制个数 + + //支持自定义绘制 + DayWidgetBuilder dayWidgetBuilder; //创建日历item + WeekBarItemWidgetBuilder weekBarItemWidgetBuilder; //创建顶部的weekbar + + /** + * 下面的信息不是配置的,是根据配置信息进行计算出来的 + */ + List monthList = new List(); //月份list + List weekList = new List(); //星期list + PageController pageController; //月份的controller + PageController weekController; //星期的controller + + CalendarConfiguration( + {this.selectMode, + this.expandStatus, + this.minYear, + this.maxYear, + this.minYearMonth, + this.maxYearMonth, + this.nowYear, + this.nowMonth, + this.minSelectYear, + this.minSelectMonth, + this.minSelectDay, + this.maxSelectYear, + this.maxSelectMonth, + this.maxSelectDay, + this.defaultSelectedDateList, + this.maxMultiSelectCount, + this.extraDataMap, + this.monthList, + this.weekList, + this.pageController, + this.weekController}); + + @override + String toString() { + return 'CalendarConfiguration{selectMode: $selectMode, expandStatus: $expandStatus, 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, pageController: $pageController, weekController: $weekController}'; + } +} diff --git a/lib/controller.dart b/lib/controller.dart index 68435e2..cd42d14 100644 --- a/lib/controller.dart +++ b/lib/controller.dart @@ -1,9 +1,13 @@ import 'package:flutter/material.dart'; +import 'package:flutter_custom_calendar/CalendarProvider.dart'; +import 'package:flutter_custom_calendar/configuration.dart'; +import 'package:flutter_custom_calendar/utils/date_util.dart'; import 'package:flutter_custom_calendar/widget/default_combine_day_view.dart'; import 'package:flutter_custom_calendar/widget/default_custom_day_view.dart'; import 'package:flutter_custom_calendar/model/date_model.dart'; import 'package:flutter_custom_calendar/widget/default_week_bar.dart'; import 'package:flutter_custom_calendar/constants/constants.dart'; +import 'package:provider/provider.dart'; /** * 利用controller来控制视图 @@ -13,55 +17,19 @@ class CalendarController { static const Set EMPTY_SET = {}; static const Map EMPTY_MAP = {}; - //默认是单选,可以配置为MODE_SINGLE_SELECT,MODE_MULTI_SELECT - int selectMode; + CalendarConfiguration calendarConfiguration; - //展开状态 - bool expandStatus; - ValueNotifier expandChanged; - - //日历显示的最小年份和最大年份 - int minYear; - int maxYear; - - //日历显示的最小年份的月份,最大年份的月份 - int minYearMonth; - int maxYearMonth; - - //日历显示的当前的年份和月份 - int nowYear; - int nowMonth; - - //可操作的范围设置,比如点击选择 - int minSelectYear; - int minSelectMonth; - int minSelectDay; - - int maxSelectYear; - int maxSelectMonth; - int maxSelectDay; //注意:不能超过对应月份的总天数 - - Set selectedDateList = new Set(); //被选中的日期,用于多选 - DateModel selectDateModel; //当前选择项,用于单选 - int maxMultiSelectCount; //多选,最多选多少个 - Map extraDataMap = new Map(); //自定义额外的数据 - - //各种事件回调 - OnMonthChange monthChange; //月份切换事件 - OnCalendarSelect calendarSelect; //点击选择事件 - OnMultiSelectOutOfRange multiSelectOutOfRange; //多选超出指定范围 - OnMultiSelectOutOfSize multiSelectOutOfSize; //多选超出限制个数 - - //支持自定义绘制 - DayWidgetBuilder dayWidgetBuilder; //创建日历item - WeekBarItemWidgetBuilder weekBarItemWidgetBuilder; //创建顶部的weekbar + CalendarProvider calendarProvider = CalendarProvider(); /** * 下面的信息不是配置的 */ List monthList = new List(); //月份list - List weekList=new List();//星期list - PageController pageController; + List weekList = new List(); //星期list + PageController pageController; //月份的controller + PageController weekController; //星期的controller + + ValueNotifier expandChanged; //扩展模式发生变化 CalendarController( {int selectMode = Constants.MODE_SINGLE_SELECT, @@ -84,32 +52,31 @@ class CalendarController { DateModel selectDateModel, int maxMultiSelectCount = 9999, Map extraDataMap = EMPTY_MAP}) { - this.selectMode = selectMode; - this.minYear = minYear; - this.maxYear = maxYear; - this.minYearMonth = minYearMonth; - this.maxYearMonth = maxYearMonth; - this.nowYear = nowYear; - this.nowMonth = nowMonth; - this.minSelectYear = minSelectYear; - this.minSelectMonth = minSelectMonth; - this.minSelectDay = minSelectDay; - this.maxSelectYear = maxSelectYear; - this.maxSelectMonth = maxSelectMonth; - this.maxSelectDay = maxSelectDay; - this.selectDateModel = selectDateModel; - this.dayWidgetBuilder = dayWidgetBuilder; - this.weekBarItemWidgetBuilder = weekBarItemWidgetBuilder; - this.maxMultiSelectCount = maxMultiSelectCount; - this.extraDataMap = extraDataMap; - this.expandStatus = expandStatus; - this.expandChanged=ValueNotifier(expandStatus); - - this.selectedDateList = Set(); + this.expandChanged = ValueNotifier(expandStatus); + + calendarConfiguration = CalendarConfiguration( + selectMode: selectMode, + minYear: minYear, + maxYear: maxYear, + maxYearMonth: maxYearMonth, + nowYear: nowYear, + nowMonth: nowMonth, + minSelectYear: minSelectYear, + minSelectMonth: minSelectMonth, + minYearMonth: minYearMonth, + minSelectDay: minSelectDay, + maxSelectYear: maxSelectYear, + maxSelectMonth: maxSelectMonth, + maxSelectDay: maxSelectDay); + + calendarConfiguration.dayWidgetBuilder = dayWidgetBuilder; + calendarConfiguration.weekBarItemWidgetBuilder = weekBarItemWidgetBuilder; + if (selectedDateTimeList != null && selectedDateTimeList.isNotEmpty) { - this.selectedDateList.addAll(selectedDateTimeList.map((dateTime) { - return DateModel.fromDateTime(dateTime); - }).toSet()); + calendarConfiguration.defaultSelectedDateList + .addAll(selectedDateTimeList.map((dateTime) { + return DateModel.fromDateTime(dateTime); + }).toSet()); } //初始化pageController,initialPage默认是当前时间对于的页面 @@ -141,26 +108,56 @@ class CalendarController { } } this.pageController = new PageController(initialPage: initialPage); + + //计算一共多少周 + //计算方法:第一天是周几,最后一天是周几,中间的天数/7后加上2就是结果了 + int initialWeekPage; + int nowWeekIndex = 0; + weekList.clear(); + int sumDays = 0; //总天数 + + DateTime firstDayOfMonth = DateTime(minYear, minYearMonth, 1); + //计算第一个星期的第一天的日期 + DateTime firstWeekDate = + firstDayOfMonth.add(Duration(days: -(firstDayOfMonth.weekday - 1))); + print("第一个星期的第一天的日期firstWeekDate:$firstWeekDate"); + DateTime lastDay = DateTime(maxYear, maxYearMonth, + DateUtil.getMonthDaysCount(maxYear, maxYearMonth)); + print("最后一天:$lastDay"); + for (DateTime dateTime = firstWeekDate; + dateTime.isBefore(lastDay); + dateTime = dateTime.add(Duration(days: 7))) { + DateModel dateModel = DateModel.fromDateTime(dateTime); + weekList.add(dateModel); + } + this.weekController = new PageController(); + + calendarConfiguration.monthList = monthList; + calendarConfiguration.weekList = weekList; + calendarConfiguration.pageController = pageController; + calendarConfiguration.weekController = weekController; + calendarConfiguration.dayWidgetBuilder = dayWidgetBuilder; + calendarConfiguration.weekBarItemWidgetBuilder = weekBarItemWidgetBuilder; } //月份切换监听 void addMonthChangeListener(OnMonthChange listener) { - this.monthChange = listener; + this.calendarConfiguration.monthChange = listener; } //点击选择监听 void addOnCalendarSelectListener(OnCalendarSelect listener) { - this.calendarSelect = listener; + this.calendarConfiguration.calendarSelect = listener; } //多选超出指定范围 void addOnMultiSelectOutOfRangeListener(OnMultiSelectOutOfRange listener) { - this.multiSelectOutOfRange = listener; + this.calendarConfiguration.multiSelectOutOfRange = listener; } //多选超出限制个数 void addOnMultiSelectOutOfSizeListener(OnMultiSelectOutOfSize listener) { - this.multiSelectOutOfSize = listener; + this.calendarConfiguration.multiSelectOutOfSize = listener; } //跳转到指定日期 @@ -237,30 +234,21 @@ class CalendarController { //获取被选中的日期,多选 Set getMultiSelectCalendar() { - if (selectedDateList.isEmpty) { - return null; - } - return selectedDateList; + return calendarProvider.selectedDateList; } //获取被选中的日期,单选 DateModel getSingleSelectCalendar() { - if (selectDateModel == null) { - return null; - } - return selectDateModel; + return calendarProvider.selectDateModel; } //切换展开状态 - void toggleExpandStatus(){ - expandChanged.value=!expandChanged.value; + void toggleExpandStatus() { + expandChanged.value = !expandChanged.value; print("toggleExpandStatus:${expandChanged.value}"); } - void addExpandChangeListener(){ - - } - + void addExpandChangeListener() {} } /** diff --git a/lib/utils/date_util.dart b/lib/utils/date_util.dart index 429b30b..0e4b65f 100644 --- a/lib/utils/date_util.dart +++ b/lib/utils/date_util.dart @@ -14,6 +14,16 @@ class DateUtil { dateTime.weekday == DateTime.sunday; } + /** + * 获取某年的天数 + */ + static int getYearDaysCount(int year) { + if (isLeapYear(year)) { + return 366; + } + return 365; + } + /** * 获取某月的天数 * diff --git a/lib/widget/calendar_view.dart b/lib/widget/calendar_view.dart index 6c92d3b..dde513b 100644 --- a/lib/widget/calendar_view.dart +++ b/lib/widget/calendar_view.dart @@ -1,13 +1,19 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_custom_calendar/CalendarProvider.dart'; +import 'package:flutter_custom_calendar/configuration.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/widget/month_view_pager.dart'; import 'package:flutter_custom_calendar/widget/week_view_pager.dart'; +import 'package:provider/provider.dart'; /** * 暂时默认是周一开始的 */ + +//由于旧的代码关系。。所以现在需要抽出一个StatefulWidget放在StatelessWidget里面 class CalendarViewWidget extends StatefulWidget { //整体的背景设置 BoxDecoration boxDecoration; @@ -15,125 +21,155 @@ class CalendarViewWidget extends StatefulWidget { //控制器 CalendarController calendarController; - CalendarViewWidget({@required this.calendarController, this.boxDecoration}); + CalendarViewWidget( + {Key key, @required this.calendarController, this.boxDecoration}) + : super(key: key); @override _CalendarViewWidgetState createState() => _CalendarViewWidgetState(); } -class _CalendarViewWidgetState extends State +class _CalendarViewWidgetState extends State { + @override + void initState() { + widget.calendarController.calendarProvider.initData( + calendarConfiguration: widget.calendarController.calendarConfiguration); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return ChangeNotifierProvider.value( + value: widget.calendarController.calendarProvider, + child: Container( + //外部可以自定义背景设置 + decoration: widget.boxDecoration, + child: const CalendarContainer()), + ); + } +} + +class CalendarContainer extends StatefulWidget { + const CalendarContainer(); + + @override + CalendarContainerState createState() => CalendarContainerState(); +} + +class CalendarContainerState extends State with SingleTickerProviderStateMixin { double itemHeight; double totalHeight; bool expand = true; - AnimationController _animationController; - @override void initState() { - _animationController = - AnimationController(duration: Duration(milliseconds: 200), vsync: this); +// widget.calendarController.expandChanged.addListener(() { +// print("_CalendarViewWidgetState:$expand"); +// setState(() { +// expand = !expand; +// }); +// }); +// + } - widget.calendarController.expandChanged.addListener(() { - print("_CalendarViewWidgetState:$expand"); - setState(() { - expand = !expand; - }); - }); + @override + void dispose() { + super.dispose(); } @override Widget build(BuildContext context) { + print("CalendarContainerState build"); //暂时先这样写死,提前计算布局的高度,不然会出现问题:a horizontal viewport was given an unlimited amount of I/flutter ( 6759): vertical space in which to expand. itemHeight = MediaQuery.of(context).size.width / 7; totalHeight = itemHeight * 6 + 10 * (6 - 1); return Container( - //外部可以自定义背景设置 - decoration: widget.boxDecoration, child: new Column( children: [ /** * 利用const,避免每次setState都会刷新到这顶部的view */ - widget.calendarController.weekBarItemWidgetBuilder(), +// widget.calendarController.weekBarItemWidgetBuilder(), AnimatedContainer( - duration: Duration(milliseconds: 500), - height: expand ? totalHeight : itemHeight, - child: expand - ? Container( - height: totalHeight, - child: MonthViewPager( - selectMode: widget.calendarController.selectMode, - monthChange: (int year, int month) { - widget.calendarController.monthChange(year, month); - }, - calendarSelect: (dateModel) { - widget.calendarController.selectDateModel = dateModel; - widget.calendarController.calendarSelect(dateModel); - }, - monthList: widget.calendarController.monthList, - pageController: widget.calendarController.pageController, - selectedDateList: - widget.calendarController.selectedDateList, - selectDateModel: - widget.calendarController.selectDateModel, - dayWidgetBuilder: - widget.calendarController.dayWidgetBuilder, - minSelectDate: DateModel() - ..year = widget.calendarController.minSelectYear - ..month = widget.calendarController.minSelectMonth - ..day = widget.calendarController.minSelectDay, - maxSelectDate: DateModel() - ..year = widget.calendarController.maxSelectYear - ..month = widget.calendarController.maxSelectMonth - ..day = widget.calendarController.maxSelectDay, - maxMultiSelectCount: - widget.calendarController.maxMultiSelectCount, - multiSelectOutOfRange: - widget.calendarController.multiSelectOutOfRange, - multiSelectOutOfSize: - widget.calendarController.multiSelectOutOfSize, - extraDataMap: widget.calendarController.extraDataMap, - ), - ) - : Container( - height: itemHeight, - child: WeekViewPager( - selectMode: widget.calendarController.selectMode, - monthChange: (int year, int month) { - widget.calendarController.monthChange(year, month); - }, - calendarSelect: (dateModel) { - widget.calendarController.selectDateModel = dateModel; - widget.calendarController.calendarSelect(dateModel); - }, - weekList: widget.calendarController.weekList, - pageController: widget.calendarController.pageController, - selectedDateList: - widget.calendarController.selectedDateList, - selectDateModel: - widget.calendarController.selectDateModel, - dayWidgetBuilder: - widget.calendarController.dayWidgetBuilder, - minSelectDate: DateModel() - ..year = widget.calendarController.minSelectYear - ..month = widget.calendarController.minSelectMonth - ..day = widget.calendarController.minSelectDay, - maxSelectDate: DateModel() - ..year = widget.calendarController.maxSelectYear - ..month = widget.calendarController.maxSelectMonth - ..day = widget.calendarController.maxSelectDay, - maxMultiSelectCount: - widget.calendarController.maxMultiSelectCount, - multiSelectOutOfRange: - widget.calendarController.multiSelectOutOfRange, - multiSelectOutOfSize: - widget.calendarController.multiSelectOutOfSize, - extraDataMap: widget.calendarController.extraDataMap, + duration: Duration(milliseconds: 500), + height: expand ? totalHeight : itemHeight, + child: +// expand ? + Container( + height: totalHeight, + child: MonthViewPager( +// selectMode: widget.calendarController.selectMode, +// monthChange: (int year, int month) { +// widget.calendarController.monthChange(year, month); +// }, +// calendarSelect: (dateModel) { +// widget.calendarController.selectDateModel = dateModel; +// widget.calendarController.calendarSelect(dateModel); +// }, +// monthList: widget.calendarController.monthList, +// pageController: widget.calendarController.pageController, +// selectedDateList: +// widget.calendarController.selectedDateList, +// selectDateModel: +// widget.calendarController.selectDateModel, +// dayWidgetBuilder: +// widget.calendarController.dayWidgetBuilder, +// minSelectDate: DateModel() +// ..year = widget.calendarController.minSelectYear +// ..month = widget.calendarController.minSelectMonth +// ..day = widget.calendarController.minSelectDay, +// maxSelectDate: DateModel() +// ..year = widget.calendarController.maxSelectYear +// ..month = widget.calendarController.maxSelectMonth +// ..day = widget.calendarController.maxSelectDay, +// maxMultiSelectCount: +// widget.calendarController.maxMultiSelectCount, +// multiSelectOutOfRange: +// widget.calendarController.multiSelectOutOfRange, +// multiSelectOutOfSize: +// widget.calendarController.multiSelectOutOfSize, +// extraDataMap: widget.calendarController.extraDataMap, ), - ), - ), + ) +// : Container( +// height: itemHeight, +// child: WeekViewPager( +// selectMode: widget.calendarController.selectMode, +// monthChange: (int year, int month) { +// widget.calendarController.monthChange(year, month); +// }, +// calendarSelect: (dateModel) { +// widget.calendarController.selectDateModel = dateModel; +// widget.calendarController.calendarSelect(dateModel); +// }, +// weekList: widget.calendarController.weekList, +// pageController: widget.calendarController.pageController, +// selectedDateList: +// widget.calendarController.selectedDateList, +// selectDateModel: +// widget.calendarController.selectDateModel, +// dayWidgetBuilder: +// widget.calendarController.dayWidgetBuilder, +// minSelectDate: DateModel() +// ..year = widget.calendarController.minSelectYear +// ..month = widget.calendarController.minSelectMonth +// ..day = widget.calendarController.minSelectDay, +// maxSelectDate: DateModel() +// ..year = widget.calendarController.maxSelectYear +// ..month = widget.calendarController.maxSelectMonth +// ..day = widget.calendarController.maxSelectDay, +// maxMultiSelectCount: +// widget.calendarController.maxMultiSelectCount, +// multiSelectOutOfRange: +// widget.calendarController.multiSelectOutOfRange, +// multiSelectOutOfSize: +// widget.calendarController.multiSelectOutOfSize, +// extraDataMap: widget.calendarController.extraDataMap, +// ), +// ), + ), ], ), ); diff --git a/lib/widget/month_view.dart b/lib/widget/month_view.dart index f329512..25016e3 100644 --- a/lib/widget/month_view.dart +++ b/lib/widget/month_view.dart @@ -1,23 +1,25 @@ import 'package:flutter/material.dart'; +import 'package:flutter_custom_calendar/CalendarProvider.dart'; +import 'package:flutter_custom_calendar/configuration.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/date_util.dart'; +import 'package:provider/provider.dart'; /** * 月视图,显示整个月的日子 */ class MonthView extends StatefulWidget { - OnCalendarSelect onCalendarSelectListener; +// OnCalendarSelect onCalendarSelectListener; - Set selectedDateList; //被选中的日期 - - DateModel selectDateModel; //当前选择项,用于单选 - - DayWidgetBuilder dayWidgetBuilder; - - OnMultiSelectOutOfRange multiSelectOutOfRange; //多选超出指定范围 - OnMultiSelectOutOfSize multiSelectOutOfSize; //多选超出限制个数 +// Set selectedDateList; //被选中的日期 +// +// DateModel selectDateModel; //当前选择项,用于单选 +// +// DayWidgetBuilder dayWidgetBuilder; +// +// OnMultiSelectOutOfRange multiSelectOutOfRange; //多选超出指定范围 +// OnMultiSelectOutOfSize multiSelectOutOfSize; //多选超出限制个数 int year; int month; @@ -26,26 +28,15 @@ class MonthView extends StatefulWidget { DateModel minSelectDate; DateModel maxSelectDate; - int selectMode; - int maxMultiSelectCount; - Map extraDataMap; //自定义额外的数据 - MonthView( - {@required this.year, - @required this.month, - this.day, - this.onCalendarSelectListener, - this.dayWidgetBuilder, - this.selectedDateList, - this.selectDateModel, - this.minSelectDate, - this.maxSelectDate, - this.selectMode, - this.multiSelectOutOfSize, - this.multiSelectOutOfRange, - this.maxMultiSelectCount, - this.extraDataMap}); + MonthView({ + @required this.year, + @required this.month, + this.day, + this.minSelectDate, + this.maxSelectDate, + }); @override _MonthViewState createState() => _MonthViewState(); @@ -60,27 +51,17 @@ class _MonthViewState extends State { double totalHeight; double mainSpacing = 10; - int year; - int month; - - DateModel selectDateModel; //当前选择项,用于单选 - @override void initState() { super.initState(); - year = widget.year; - month = widget.month; - items = DateUtil.initCalendarForMonthView( - year, month, DateTime.now(), DateTime.sunday, + widget.year, widget.month, DateTime.now(), DateTime.sunday, minSelectDate: widget.minSelectDate, maxSelectDate: widget.maxSelectDate, extraDataMap: widget.extraDataMap); - lineCount = DateUtil.getMonthViewLineCount(year, month); - - selectDateModel = widget.selectDateModel; + lineCount = DateUtil.getMonthViewLineCount(widget.year, widget.month); } @override @@ -96,67 +77,72 @@ class _MonthViewState extends State { } Widget getView() { - return new GridView.builder( - physics: NeverScrollableScrollPhysics(), - gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 7, mainAxisSpacing: 10), - itemCount: 7 * lineCount, - itemBuilder: (context, index) { - DateModel dateModel = items[index]; - //判断是否被选择 - if (widget.selectMode == Constants.MODE_MULTI_SELECT) { - if (widget.selectedDateList.contains(dateModel)) { - dateModel.isSelected = true; - } else { - dateModel.isSelected = false; - } - } else { - if (selectDateModel == dateModel) { - dateModel.isSelected = true; + return Consumer( + builder: (context, calendarProvider, child) { + CalendarConfiguration configuration = + calendarProvider.calendarConfiguration; + print( + "Consumer:calendarProvider.selectDateModel:${calendarProvider.selectDateModel}"); + return new GridView.builder( + physics: NeverScrollableScrollPhysics(), + gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 7, mainAxisSpacing: 10), + itemCount: 7 * lineCount, + itemBuilder: (context, index) { + DateModel dateModel = items[index]; + //判断是否被选择 + if (configuration.selectMode == Constants.MODE_MULTI_SELECT) { + if (calendarProvider.selectedDateList.contains(dateModel)) { + dateModel.isSelected = true; + } else { + dateModel.isSelected = false; + } } else { - dateModel.isSelected = false; - } - } - - return GestureDetector( - onTap: () { - //范围外不可点击 - if (!dateModel.isInRange) { - //多选回调 - if (widget.selectMode == Constants.MODE_MULTI_SELECT) { - widget.multiSelectOutOfRange(); - } - return; + if (calendarProvider.selectDateModel == dateModel) { + dateModel.isSelected = true; + } else { + dateModel.isSelected = false; } + } - if (widget.selectMode == Constants.MODE_MULTI_SELECT) { - //多选,判断是否超过限制,超过范围 - if (widget.selectedDateList.length == - widget.maxMultiSelectCount) { - widget.multiSelectOutOfSize(); + return GestureDetector( + onTap: () { + print("GestureDetector onTap:$dateModel"); + //范围外不可点击 + if (!dateModel.isInRange) { + //多选回调 + if (configuration.selectMode == Constants.MODE_MULTI_SELECT) { + configuration.multiSelectOutOfRange(); + } return; } - //多选也可以弄这些单选的代码 - selectDateModel = dateModel; - widget.selectDateModel = dateModel; - widget.onCalendarSelectListener(dateModel); - setState(() { - if (widget.selectedDateList.contains(dateModel)) { - widget.selectedDateList.remove(dateModel); - } else { - widget.selectedDateList.add(dateModel); + if (configuration.selectMode == Constants.MODE_MULTI_SELECT) { + //多选,判断是否超过限制,超过范围 + if (calendarProvider.selectedDateList.length == + configuration.maxMultiSelectCount) { + configuration.multiSelectOutOfSize(); + return; } - }); - } else { - selectDateModel = dateModel; - widget.selectDateModel = dateModel; - widget.onCalendarSelectListener(dateModel); - setState(() {}); - } - }, - child: widget.dayWidgetBuilder(dateModel), - ); - }); + + //多选也可以弄这些单选的代码 + calendarProvider.selectDateModel = dateModel; + configuration.calendarSelect(dateModel); + setState(() { + if (calendarProvider.selectedDateList.contains(dateModel)) { + calendarProvider.selectedDateList.remove(dateModel); + } else { + calendarProvider.selectedDateList.add(dateModel); + } + }); + } else { + calendarProvider.selectDateModel = dateModel; + configuration.calendarSelect(dateModel); + } + }, + child: configuration.dayWidgetBuilder(dateModel), + ); + }); + }); } } diff --git a/lib/widget/month_view_pager.dart b/lib/widget/month_view_pager.dart index e1f8787..8347af0 100644 --- a/lib/widget/month_view_pager.dart +++ b/lib/widget/month_view_pager.dart @@ -1,44 +1,12 @@ import 'package:flutter/material.dart'; -import 'package:flutter_custom_calendar/controller.dart'; +import 'package:flutter_custom_calendar/CalendarProvider.dart'; +import 'package:flutter_custom_calendar/configuration.dart'; import 'package:flutter_custom_calendar/model/date_model.dart'; import 'package:flutter_custom_calendar/widget/month_view.dart'; +import 'package:provider/provider.dart'; class MonthViewPager extends StatefulWidget { - final OnMonthChange monthChange; - final OnCalendarSelect calendarSelect; - final DayWidgetBuilder dayWidgetBuilder; - OnMultiSelectOutOfRange multiSelectOutOfRange; //多选超出指定范围 - OnMultiSelectOutOfSize multiSelectOutOfSize; //多选超出限制个数 - - Set selectedDateList; //被选中的日期,用于多选 - DateModel selectDateModel; //当前选择项,用于单选 - - final List monthList; - PageController pageController; - - DateModel minSelectDate; - DateModel maxSelectDate; - - int selectMode; - int maxMultiSelectCount; - - Map extraDataMap ; //自定义额外的数据 - - MonthViewPager( - {this.monthChange, - this.calendarSelect, - this.monthList, - this.pageController, - this.selectedDateList, - this.selectDateModel, - this.dayWidgetBuilder, - this.minSelectDate, - this.maxSelectDate, - this.selectMode, - this.maxMultiSelectCount, - this.multiSelectOutOfRange, - this.multiSelectOutOfSize, - this.extraDataMap}); + MonthViewPager(); @override _MonthViewPagerState createState() => _MonthViewPagerState(); @@ -50,47 +18,46 @@ class _MonthViewPagerState extends State { @override Widget build(BuildContext context) { +// 获取到当前的CalendarProvider对象,设置listen为false,不需要刷新 + CalendarProvider calendarProvider = + Provider.of(context, listen: false); + CalendarConfiguration configuration = + calendarProvider.calendarConfiguration; + return Container( child: PageView.builder( onPageChanged: (position) { //月份的变化 - DateModel dateModel = widget.monthList[position]; - widget.monthChange(dateModel.year, dateModel.month); + DateModel dateModel = configuration.monthList[position]; + configuration.monthChange(dateModel.year, dateModel.month); }, - controller: widget.pageController, + controller: configuration.pageController, itemBuilder: (context, index) { - DateModel dateModel = widget.monthList[index]; + DateModel dateModel = configuration.monthList[index]; return new MonthView( - selectMode: widget.selectMode, +// selectMode: configuration.selectMode, year: dateModel.year, month: dateModel.month, - selectDateModel: widget.selectDateModel, - selectedDateList: widget.selectedDateList, - onCalendarSelectListener: widget.calendarSelect, - dayWidgetBuilder: widget.dayWidgetBuilder, - minSelectDate: widget.minSelectDate, - maxSelectDate: widget.maxSelectDate, - maxMultiSelectCount: widget.maxMultiSelectCount, - multiSelectOutOfRange: widget.multiSelectOutOfRange, - multiSelectOutOfSize: widget.multiSelectOutOfSize, - extraDataMap: widget.extraDataMap, +// selectDateModel: calendarProvider.selectDateModel, +// selectedDateList: calendarProvider.selectedDateList, +// onCalendarSelectListener: configuration.calendarSelect, +// dayWidgetBuilder: configuration.dayWidgetBuilder, + minSelectDate: DateModel.fromDateTime(DateTime( + configuration.minSelectYear, + configuration.minSelectMonth, + configuration.minSelectDay)), + maxSelectDate: DateModel.fromDateTime(DateTime( + configuration.maxSelectYear, + configuration.maxSelectMonth, + configuration.maxSelectDay)), +// maxMultiSelectCount: configuration.maxMultiSelectCount, +// multiSelectOutOfRange: configuration.multiSelectOutOfRange, +// multiSelectOutOfSize: configuration.multiSelectOutOfSize, +// extraDataMap: configuration.extraDataMap, ); }, - itemCount: widget.monthList.length, + itemCount: configuration.monthList.length, ), ); - -// return SliverFillViewport( -// delegate: SliverChildBuilderDelegate((context, index) { -// DateModel dateModel = widget.monthList[index]; -// return new MonthView( -// year: dateModel.year, -// month: dateModel.month, -// selectDateModel: widget.selectDateModel, -// selectedDateList: widget.selectedDateList, -// onCalendarSelectListener: widget.calendarSelect, -// ); -// }, childCount: widget.monthList.length), -// ); } }