创建configuration类,将配置的信息放到这里

引入provider状态管理,避免深层嵌套传递信息
周视图和月视图,联动
develop
LXD312569496 5 years ago committed by xiaodong
parent d48e3101ce
commit 116d216850

@ -1,3 +1,4 @@
import 'package:example/main.dart';
import 'package:flutter/material.dart';
import 'package:flutter_custom_calendar/flutter_custom_calendar.dart';
@ -19,7 +20,8 @@ class _DefaultStylePageState extends State<DefaultStylePage> {
void initState() {
text = "${DateTime.now().year}${DateTime.now().month}";
controller = new CalendarController();
controller = new CalendarController(
minYear: 2019, minYearMonth: 8, maxYear: 2019, maxYearMonth: 9);
controller.addMonthChangeListener(
(year, month) {
@ -50,13 +52,15 @@ class _DefaultStylePageState extends State<DefaultStylePage> {
new IconButton(
icon: Icon(Icons.navigate_before),
onPressed: () {
controller.moveToPreviousMonth();
// controller.moveToPreviousMonth();
controller.previousPage();
}),
new Text(text),
new IconButton(
icon: Icon(Icons.navigate_next),
onPressed: () {
controller.moveToNextMonth();
// controller.moveToNextMonth();
controller.nextPage();
}),
],
),
@ -69,7 +73,9 @@ class _DefaultStylePageState extends State<DefaultStylePage> {
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {},
onPressed: () {
controller.toggleExpandStatus();
},
tooltip: 'Increment',
child: Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.

@ -10,6 +10,7 @@ import 'package:flutter_custom_calendar/model/date_model.dart';
class CalendarProvider extends ChangeNotifier {
Set<DateModel> selectedDateList = new Set(); //,
DateModel _selectDateModel; //
DateModel lastClickDateModel; //
DateModel get selectDateModel => _selectDateModel;
@ -19,6 +20,8 @@ class CalendarProvider extends ChangeNotifier {
notifyListeners();
}
ValueNotifier<bool> expandStatus = ValueNotifier(true); //
//
CalendarConfiguration calendarConfiguration;
@ -32,6 +35,10 @@ class CalendarProvider extends ChangeNotifier {
}
this.selectDateModel = selectDateModel;
this.calendarConfiguration = calendarConfiguration;
//lastClickDateModelitem
this.lastClickDateModel = selectDateModel != null
? selectDateModel
: DateModel.fromDateTime(DateTime.now());
}
//退

@ -10,7 +10,7 @@ class CalendarConfiguration {
int selectMode;
//
bool expandStatus;
bool defaultExpandStatus;
//
int minYear;
@ -60,7 +60,6 @@ class CalendarConfiguration {
CalendarConfiguration(
{this.selectMode,
this.expandStatus,
this.minYear,
this.maxYear,
this.minYearMonth,
@ -79,10 +78,13 @@ class CalendarConfiguration {
this.monthList,
this.weekList,
this.pageController,
this.weekController});
this.weekController,
bool defaultExpandStatus = true}) {
this.defaultExpandStatus = defaultExpandStatus;
}
@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}';
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, pageController: $pageController, weekController: $weekController}';
}
}

@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter_custom_calendar/CalendarProvider.dart';
import 'package:flutter_custom_calendar/calendar_provider.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';
@ -16,6 +16,7 @@ import 'package:provider/provider.dart';
class CalendarController {
static const Set<DateTime> EMPTY_SET = {};
static const Map<DateTime, Object> EMPTY_MAP = {};
static const Duration DEFAULT_DURATION = const Duration(milliseconds: 500);
CalendarConfiguration calendarConfiguration;
@ -26,11 +27,9 @@ class CalendarController {
*/
List<DateModel> monthList = new List(); //list
List<DateModel> weekList = new List(); //list
PageController pageController; //controller
PageController monthController; //controller
PageController weekController; //controller
ValueNotifier<bool> expandChanged; //
CalendarController(
{int selectMode = Constants.MODE_SINGLE_SELECT,
bool expandStatus = true,
@ -52,7 +51,7 @@ class CalendarController {
DateModel selectDateModel,
int maxMultiSelectCount = 9999,
Map<DateTime, Object> extraDataMap = EMPTY_MAP}) {
this.expandChanged = ValueNotifier(expandStatus);
// this.expandChanged = ValueNotifier(expandStatus);
calendarConfiguration = CalendarConfiguration(
selectMode: selectMode,
@ -67,6 +66,7 @@ class CalendarController {
minSelectDay: minSelectDay,
maxSelectYear: maxSelectYear,
maxSelectMonth: maxSelectMonth,
defaultExpandStatus: expandStatus,
maxSelectDay: maxSelectDay);
calendarConfiguration.dayWidgetBuilder = dayWidgetBuilder;
@ -107,7 +107,7 @@ class CalendarController {
nowMonthIndex++;
}
}
this.pageController = new PageController(initialPage: initialPage);
this.monthController = new PageController(initialPage: initialPage);
//
///72
@ -125,16 +125,17 @@ class CalendarController {
DateUtil.getMonthDaysCount(maxYear, maxYearMonth));
print("最后一天:$lastDay");
for (DateTime dateTime = firstWeekDate;
dateTime.isBefore(lastDay);
!dateTime.isAfter(lastDay);
dateTime = dateTime.add(Duration(days: 7))) {
DateModel dateModel = DateModel.fromDateTime(dateTime);
weekList.add(dateModel);
}
this.weekController = new PageController();
print("weekList:$weekList");
calendarConfiguration.monthList = monthList;
calendarConfiguration.weekList = weekList;
calendarConfiguration.pageController = pageController;
calendarConfiguration.pageController = monthController;
calendarConfiguration.weekController = weekController;
calendarConfiguration.dayWidgetBuilder = dayWidgetBuilder;
calendarConfiguration.weekBarItemWidgetBuilder = weekBarItemWidgetBuilder;
@ -160,6 +161,74 @@ class CalendarController {
this.calendarConfiguration.multiSelectOutOfSize = listener;
}
//
void toggleExpandStatus() {
calendarProvider.expandStatus.value = !calendarProvider.expandStatus.value;
print("toggleExpandStatus${calendarProvider.expandStatus.value}");
}
//
void addExpandChangeListener(ValueChanged<bool> expandChange) {
calendarProvider.expandStatus.addListener(() {
expandChange(calendarProvider.expandStatus.value);
});
}
/**
*
*/
Future<bool> previousPage() async {
if (calendarProvider.expandStatus.value == true) {
//
int currentIndex = monthController.page.toInt();
if (currentIndex == 0) {
return false;
} else {
monthController.previousPage(
duration: DEFAULT_DURATION, curve: Curves.ease);
return true;
}
} else {
//
int currentIndex = weekController.page.toInt();
if (currentIndex == 0) {
return false;
} else {
weekController.previousPage(
duration: DEFAULT_DURATION, curve: Curves.ease);
return true;
}
}
}
/**
*
* true
* false:
*/
Future<bool> nextPage() async {
if (calendarProvider.expandStatus.value == true) {
//
int currentIndex = monthController.page.toInt();
if (monthList.length - 1 == currentIndex) {
return false;
} else {
monthController.nextPage(
duration: DEFAULT_DURATION, curve: Curves.ease);
return true;
}
} else {
//
int currentIndex = weekController.page.toInt();
if (weekList.length - 1 == currentIndex) {
return false;
} else {
weekController.nextPage(duration: DEFAULT_DURATION, curve: Curves.ease);
return true;
}
}
}
//
void moveToCalendar(int year, int month, int day,
{bool needAnimation = false,
@ -171,11 +240,14 @@ class CalendarController {
if (targetPage == -1) {
return;
}
if (monthController.hasClients == false) {
return;
}
if (needAnimation) {
pageController.animateToPage(targetPage,
monthController.animateToPage(targetPage,
duration: duration, curve: curve);
} else {
pageController.jumpToPage(targetPage);
monthController.jumpToPage(targetPage);
}
}
@ -185,7 +257,7 @@ class CalendarController {
Duration duration = const Duration(milliseconds: 500),
Curve curve = Curves.ease}) {
DateTime targetDateTime =
monthList[pageController.page.toInt() + 12].getDateTime();
monthList[monthController.page.toInt() + 12].getDateTime();
moveToCalendar(
targetDateTime.year, targetDateTime.month, targetDateTime.day,
needAnimation: needAnimation, duration: duration, curve: curve);
@ -197,7 +269,7 @@ class CalendarController {
Duration duration = const Duration(milliseconds: 500),
Curve curve = Curves.ease}) {
DateTime targetDateTime =
monthList[pageController.page.toInt() - 12].getDateTime();
monthList[monthController.page.toInt() - 12].getDateTime();
moveToCalendar(
targetDateTime.year, targetDateTime.month, targetDateTime.day,
needAnimation: needAnimation, duration: duration, curve: curve);
@ -208,8 +280,24 @@ class CalendarController {
{bool needAnimation = false,
Duration duration = const Duration(milliseconds: 500),
Curve curve = Curves.ease}) {
// indexweekController
if (calendarProvider.expandStatus.value == false) {
int currentMonth = weekList[weekController.page.toInt()].month;
for (int i = weekController.page.toInt(); i < weekList.length; i++) {
if (weekList[i].month != currentMonth) {
weekController.jumpToPage(i);
break;
}
}
return;
}
if ((monthController.page.toInt() + 1) >= monthList.length) {
print("moveToNextMonth当前是最后一个月份");
return;
}
DateTime targetDateTime =
monthList[pageController.page.toInt() + 1].getDateTime();
monthList[monthController.page.toInt() + 1].getDateTime();
moveToCalendar(
targetDateTime.year, targetDateTime.month, targetDateTime.day,
needAnimation: needAnimation, duration: duration, curve: curve);
@ -220,8 +308,27 @@ class CalendarController {
{bool needAnimation = false,
Duration duration = const Duration(milliseconds: 500),
Curve curve = Curves.ease}) {
// indexweekController
if (calendarProvider.expandStatus.value == false) {
int currentMonth = weekList[weekController.page.toInt()].month;
for (int i = weekController.page.toInt(); i >= 0; i--) {
if (weekList[i].month != currentMonth &&
weekList[i].isAfter(DateModel.fromDateTime(DateTime(
calendarConfiguration.minYear,
calendarConfiguration.minYearMonth)))) {
weekController.jumpToPage(i);
break;
}
}
return;
}
if ((monthController.page.toInt()) == 0) {
print("moveToPreviousMonth当前是第一个月份");
return;
}
DateTime targetDateTime =
monthList[pageController.page.toInt() - 1].getDateTime();
monthList[monthController.page.toInt() - 1].getDateTime();
moveToCalendar(
targetDateTime.year, targetDateTime.month, targetDateTime.day,
needAnimation: needAnimation, duration: duration, curve: curve);
@ -229,7 +336,7 @@ class CalendarController {
//
DateModel getCurrentMonth() {
return monthList[pageController.page.toInt()];
return monthList[monthController.page.toInt()];
}
//,
@ -241,14 +348,6 @@ class CalendarController {
DateModel getSingleSelectCalendar() {
return calendarProvider.selectDateModel;
}
//
void toggleExpandStatus() {
expandChanged.value = !expandChanged.value;
print("toggleExpandStatus${expandChanged.value}");
}
void addExpandChangeListener() {}
}
/**

@ -68,7 +68,13 @@ class DateModel {
day == dateModel.day;
}
//
bool isAfter(DateModel dateModel) {
return this.getDateTime().isAfter(dateModel.getDateTime());
}
//
bool isBefore(DateModel dateModel) {
return this.getDateTime().isBefore(dateModel.getDateTime());
}
}

@ -191,6 +191,7 @@ class DateUtil {
{DateModel minSelectDate,
DateModel maxSelectDate,
Map<DateTime, Object> extraDataMap}) {
print("initCalendarForWeekView");
List<DateModel> items = List();
int weekDay = currentDate.weekday;
@ -201,11 +202,24 @@ class DateUtil {
for (int i = 1; i <= 7; i++) {
DateModel dateModel =
DateModel.fromDateTime(firstDayOfWeek.add(Duration(days: i)));
items.add(dateModel);
}
print("items.toString():${items.toString()}");
//
if (dateModel.getDateTime().isAfter(minSelectDate.getDateTime()) &&
dateModel.getDateTime().isBefore(maxSelectDate.getDateTime())) {
dateModel.isInRange = true;
} else {
dateModel.isInRange = false;
}
//model
if (extraDataMap != null && extraDataMap.isNotEmpty) {
DateTime dateTime = dateModel.getDateTime();
if (extraDataMap.containsKey(dateTime)) {
dateModel.extraData = extraDataMap[dateTime];
}
}
items.add(dateModel);
}
return items;
}
}

@ -1,8 +1,5 @@
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/calendar_provider.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';
@ -19,7 +16,7 @@ class CalendarViewWidget extends StatefulWidget {
BoxDecoration boxDecoration;
//
CalendarController calendarController;
final CalendarController calendarController;
CalendarViewWidget(
{Key key, @required this.calendarController, this.boxDecoration})
@ -32,8 +29,10 @@ class CalendarViewWidget extends StatefulWidget {
class _CalendarViewWidgetState extends State<CalendarViewWidget> {
@override
void initState() {
//provider
widget.calendarController.calendarProvider.initData(
calendarConfiguration: widget.calendarController.calendarConfiguration);
super.initState();
}
@ -44,6 +43,7 @@ class _CalendarViewWidgetState extends State<CalendarViewWidget> {
child: Container(
//
decoration: widget.boxDecoration,
//使constsetStatewidget
child: const CalendarContainer()),
);
}
@ -63,15 +63,17 @@ class CalendarContainerState extends State<CalendarContainer>
bool expand = true;
CalendarProvider calendarProvider;
@override
void initState() {
// widget.calendarController.expandChanged.addListener(() {
// print("_CalendarViewWidgetState:$expand");
// setState(() {
// expand = !expand;
// });
// });
//
calendarProvider = Provider.of<CalendarProvider>(context, listen: false);
expand = calendarProvider.expandStatus.value;
calendarProvider.expandStatus.addListener(() {
setState(() {
expand = !expand;
});
});
}
@override
@ -91,85 +93,20 @@ class CalendarContainerState extends State<CalendarContainer>
/**
* constsetStateview
*/
// widget.calendarController.weekBarItemWidgetBuilder(),
calendarProvider.calendarConfiguration.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: 200),
height: expand ? totalHeight : itemHeight,
child: expand
? Container(
height: totalHeight,
child: MonthViewPager(),
)
: Container(
height: itemHeight,
child: WeekViewPager(),
),
),
],
),
);

@ -0,0 +1,32 @@
import 'package:flutter/material.dart';
/**
*
*/
class FastClickWidget extends StatelessWidget {
final int between_time = 500; //500ms
Function onTap;
Widget child;
FastClickWidget({@required this.onTap, @required this.child});
int lastClickTime = 0;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
if (lastClickTime == 0 ||
DateTime.now().millisecondsSinceEpoch - lastClickTime >
between_time) {
onTap();
lastClickTime = DateTime.now().millisecondsSinceEpoch;
} else {
//500ms
}
},
child: child,
);
}
}

@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter_custom_calendar/CalendarProvider.dart';
import 'package:flutter_custom_calendar/calendar_provider.dart';
import 'package:flutter_custom_calendar/configuration.dart';
import 'package:flutter_custom_calendar/constants/constants.dart';
import 'package:flutter_custom_calendar/model/date_model.dart';
@ -10,32 +10,22 @@ import 'package:provider/provider.dart';
*
*/
class MonthView extends StatefulWidget {
// OnCalendarSelect onCalendarSelectListener;
final int year;
final int month;
final int day;
// Set<DateModel> selectedDateList; //
//
// DateModel selectDateModel; //,
//
// DayWidgetBuilder dayWidgetBuilder;
//
// OnMultiSelectOutOfRange multiSelectOutOfRange; //
// OnMultiSelectOutOfSize multiSelectOutOfSize; //
final DateModel minSelectDate;
final DateModel maxSelectDate;
int year;
int month;
int day;
final Map<DateTime, Object> extraDataMap; //
DateModel minSelectDate;
DateModel maxSelectDate;
Map<DateTime, Object> extraDataMap; //
MonthView({
const MonthView({
@required this.year,
@required this.month,
this.day,
this.minSelectDate,
this.maxSelectDate,
this.extraDataMap,
});
@override
@ -82,7 +72,7 @@ class _MonthViewState extends State<MonthView> {
CalendarConfiguration configuration =
calendarProvider.calendarConfiguration;
print(
"Consumer:calendarProvider.selectDateModel:${calendarProvider.selectDateModel}");
"MonthView Consumer:calendarProvider.selectDateModel:${calendarProvider.selectDateModel}");
return new GridView.builder(
physics: NeverScrollableScrollPhysics(),
gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
@ -108,6 +98,8 @@ class _MonthViewState extends State<MonthView> {
return GestureDetector(
onTap: () {
print("GestureDetector onTap$dateModel");
print("!dateModel.isInRange:${!dateModel.isInRange}");
//
if (!dateModel.isInRange) {
//
@ -117,6 +109,8 @@ class _MonthViewState extends State<MonthView> {
return;
}
calendarProvider.lastClickDateModel = dateModel;
if (configuration.selectMode == Constants.MODE_MULTI_SELECT) {
//
if (calendarProvider.selectedDateList.length ==

@ -1,7 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_custom_calendar/CalendarProvider.dart';
import 'package:flutter_custom_calendar/calendar_provider.dart';
import 'package:flutter_custom_calendar/configuration.dart';
import 'package:flutter_custom_calendar/model/date_model.dart';
import 'package:flutter_custom_calendar/utils/date_util.dart';
import 'package:flutter_custom_calendar/widget/month_view.dart';
import 'package:provider/provider.dart';
@ -13,14 +14,50 @@ class MonthViewPager extends StatefulWidget {
}
class _MonthViewPagerState extends State<MonthViewPager> {
CalendarProvider calendarProvider;
@override
void initState() {}
void initState() {
calendarProvider = Provider.of<CalendarProvider>(context, listen: false);
//index
DateModel dateModel = calendarProvider.lastClickDateModel;
List<DateModel> monthList =
calendarProvider.calendarConfiguration.monthList;
int index = 0;
for (int i = 0; i < monthList.length; i++) {
DateModel firstDayOfMonth = monthList[i];
DateModel lastDayOfMonth = DateModel.fromDateTime(firstDayOfMonth
.getDateTime()
.add(Duration(
days: DateUtil.getMonthDaysCount(
firstDayOfMonth.year, firstDayOfMonth.month))));
// print("firstDayOfMonth:$firstDayOfMonth");
// print("lastDayOfMonth:$lastDayOfMonth");
if ((dateModel.isAfter(firstDayOfMonth) ||
dateModel.isSameWith(firstDayOfMonth)) &&
dateModel.isBefore(lastDayOfMonth)) {
index = i;
break;
}
}
// print("monthList:$monthList");
// print("当前月:index:$index");
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
calendarProvider.calendarConfiguration.pageController.jumpToPage(index);
});
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
// CalendarProvider,listenfalse
CalendarProvider calendarProvider =
Provider.of<CalendarProvider>(context, listen: false);
calendarProvider = Provider.of<CalendarProvider>(context, listen: false);
CalendarConfiguration configuration =
calendarProvider.calendarConfiguration;
@ -35,13 +72,8 @@ class _MonthViewPagerState extends State<MonthViewPager> {
itemBuilder: (context, index) {
DateModel dateModel = configuration.monthList[index];
return new MonthView(
// selectMode: configuration.selectMode,
year: dateModel.year,
month: dateModel.month,
// selectDateModel: calendarProvider.selectDateModel,
// selectedDateList: calendarProvider.selectedDateList,
// onCalendarSelectListener: configuration.calendarSelect,
// dayWidgetBuilder: configuration.dayWidgetBuilder,
minSelectDate: DateModel.fromDateTime(DateTime(
configuration.minSelectYear,
configuration.minSelectMonth,
@ -50,10 +82,7 @@ class _MonthViewPagerState extends State<MonthViewPager> {
configuration.maxSelectYear,
configuration.maxSelectMonth,
configuration.maxSelectDay)),
// maxMultiSelectCount: configuration.maxMultiSelectCount,
// multiSelectOutOfRange: configuration.multiSelectOutOfRange,
// multiSelectOutOfSize: configuration.multiSelectOutOfSize,
// extraDataMap: configuration.extraDataMap,
extraDataMap: configuration.extraDataMap,
);
},
itemCount: configuration.monthList.length,

@ -1,50 +1,31 @@
import 'package:flutter/material.dart';
import 'package:flutter_custom_calendar/calendar_provider.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 WeekView extends StatefulWidget {
OnCalendarSelect onCalendarSelectListener;
final int year;
final int month;
final DateModel firstDayOfWeek;
Set<DateModel> selectedDateList; //
final DateModel minSelectDate;
final DateModel maxSelectDate;
DateModel selectDateModel; //,
final Map<DateTime, Object> extraDataMap; //
DayWidgetBuilder dayWidgetBuilder;
OnMultiSelectOutOfRange multiSelectOutOfRange; //
OnMultiSelectOutOfSize multiSelectOutOfSize; //
int year;
int month;
int day;
DateModel minSelectDate;
DateModel maxSelectDate;
int selectMode;
int maxMultiSelectCount;
Map<DateTime, Object> extraDataMap; //
WeekView(
const WeekView(
{@required this.year,
@required this.month,
this.day,
this.onCalendarSelectListener,
this.dayWidgetBuilder,
this.selectedDateList,
this.selectDateModel,
this.firstDayOfWeek,
this.minSelectDate,
this.maxSelectDate,
this.selectMode,
this.multiSelectOutOfSize,
this.multiSelectOutOfRange,
this.maxMultiSelectCount,
this.extraDataMap});
@override
@ -53,80 +34,88 @@ class WeekView extends StatefulWidget {
class _WeekViewState extends State<WeekView> {
List<DateModel> items;
DateModel selectDateModel; //,
@override
void initState() {
super.initState();
items=DateUtil.initCalendarForWeekView(2019, 9, DateTime.now(), 0);
items = DateUtil.initCalendarForWeekView(
2019, 9, widget.firstDayOfWeek.getDateTime(), 0,
minSelectDate: widget.minSelectDate,
maxSelectDate: widget.maxSelectDate,
extraDataMap: widget.extraDataMap);
}
@override
Widget build(BuildContext context) {
return new GridView.builder(
physics: NeverScrollableScrollPhysics(),
gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 7, mainAxisSpacing: 10),
itemCount: 7,
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<CalendarProvider>(
builder: (context, calendarProvider, child) {
CalendarConfiguration configuration =
calendarProvider.calendarConfiguration;
print(
"WeekView Consumer:calendarProvider.selectDateModel:${calendarProvider.selectDateModel}");
return new GridView.builder(
physics: NeverScrollableScrollPhysics(),
gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 7, mainAxisSpacing: 10),
itemCount: 7,
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");
print("!dateModel.isInRange:${!dateModel.isInRange}");
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);
calendarProvider.lastClickDateModel = 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);
// setState(() {});
}
},
child: configuration.dayWidgetBuilder(dateModel),
);
});
});
}
}

@ -1,88 +1,99 @@
import 'package:flutter/material.dart';
import 'package:flutter_custom_calendar/calendar_provider.dart';
import 'package:flutter_custom_calendar/configuration.dart';
import 'package:flutter_custom_calendar/controller.dart';
import 'package:flutter_custom_calendar/model/date_model.dart';
import 'package:flutter_custom_calendar/widget/week_view.dart';
import 'package:provider/provider.dart';
class WeekViewPager extends StatefulWidget {
final OnMonthChange monthChange;
final OnCalendarSelect calendarSelect;
final DayWidgetBuilder dayWidgetBuilder;
OnMultiSelectOutOfRange multiSelectOutOfRange; //
OnMultiSelectOutOfSize multiSelectOutOfSize; //
Set<DateModel> selectedDateList; //,
DateModel selectDateModel; //,
final List<DateModel> weekList;
PageController pageController;
DateModel minSelectDate;
DateModel maxSelectDate;
int selectMode;
int maxMultiSelectCount;
Map<DateTime, Object> extraDataMap; //
WeekViewPager(
{this.monthChange,
this.calendarSelect,
this.weekList,
this.pageController,
this.selectedDateList,
this.selectDateModel,
this.dayWidgetBuilder,
this.minSelectDate,
this.maxSelectDate,
this.selectMode,
this.maxMultiSelectCount,
this.multiSelectOutOfRange,
this.multiSelectOutOfSize,
this.extraDataMap});
WeekViewPager();
@override
_WeekViewPagerState createState() => _WeekViewPagerState();
}
class _WeekViewPagerState extends State<WeekViewPager> {
int lastMonth;//
int lastMonth; //
CalendarProvider calendarProvider;
@override
void initState() {
// lastMonth=
print("WeekViewPager initState");
calendarProvider = Provider.of<CalendarProvider>(context, listen: false);
lastMonth = calendarProvider.lastClickDateModel.month;
//index
DateModel dateModel = calendarProvider.lastClickDateModel;
List<DateModel> weekList = calendarProvider.calendarConfiguration.weekList;
int index = 0;
for (int i = 0; i < weekList.length; i++) {
DateModel firstDayOfWeek = weekList[i];
DateModel lastDayOfWeek = DateModel.fromDateTime(
firstDayOfWeek.getDateTime().add(Duration(days: 7)));
if ((dateModel.isSameWith(weekList[i]) ||
dateModel.isAfter(weekList[i])) &&
dateModel.isBefore(lastDayOfWeek)) {
index = i;
break;
}
}
// print("weekList:$weekList");
// print("当前周:index:$index");
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
calendarProvider.calendarConfiguration.weekController.jumpToPage(index);
});
}
@override
void dispose() {
print("WeekViewPager dispose");
super.dispose();
}
@override
Widget build(BuildContext context) {
// CalendarProvider,listenfalse
CalendarProvider calendarProvider =
Provider.of<CalendarProvider>(context, listen: false);
CalendarConfiguration configuration =
calendarProvider.calendarConfiguration;
return Container(
child: PageView.builder(
onPageChanged: (position) {
//
DateModel dateModel = widget.weekList[position];
widget.monthChange(dateModel.year, dateModel.month);
//
DateModel firstDayOfWeek = configuration.weekList[position];
int currentMonth = firstDayOfWeek.month;
if (lastMonth != currentMonth) {
configuration.monthChange(
firstDayOfWeek.year, firstDayOfWeek.month);
}
// DateModel dateModel = configuration.weekList[position];
// configuration.monthChange(dateModel.year, dateModel.month);
},
controller: widget.pageController,
controller: configuration.weekController,
itemBuilder: (context, index) {
DateModel dateModel = widget.weekList[index];
DateModel dateModel = configuration.weekList[index];
return new WeekView(
selectMode: widget.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,
firstDayOfWeek: dateModel,
minSelectDate: DateModel.fromDateTime(DateTime(
configuration.minSelectYear,
configuration.minSelectMonth,
configuration.minSelectDay)),
maxSelectDate: DateModel.fromDateTime(DateTime(
configuration.maxSelectYear,
configuration.maxSelectMonth,
configuration.maxSelectDay)),
extraDataMap: configuration.extraDataMap,
);
},
itemCount: widget.weekList.length,
itemCount: configuration.weekList.length,
),
);
}

@ -10,7 +10,7 @@ environment:
dependencies:
flutter:
sdk: flutter
provider: 3.0.0+1
dev_dependencies:
flutter_test:
sdk: flutter

Loading…
Cancel
Save