You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
flutter_custom_calendar/lib/widget/month_view_pager.dart

105 lines
3.5 KiB

6 years ago
import 'package:flutter/material.dart';
import 'package:flutter_custom_calendar/calendar_provider.dart';
import 'package:flutter_custom_calendar/configuration.dart';
6 years ago
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';
6 years ago
class MonthViewPager extends StatefulWidget {
MonthViewPager();
6 years ago
@override
_MonthViewPagerState createState() => _MonthViewPagerState();
}
class _MonthViewPagerState extends State<MonthViewPager> {
CalendarProvider calendarProvider;
var totalHeight;
6 years ago
@override
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))));
if ((dateModel.isAfter(firstDayOfMonth) ||
dateModel.isSameWith(firstDayOfMonth)) &&
dateModel.isBefore(lastDayOfMonth)) {
index = i;
break;
}
}
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
calendarProvider.calendarConfiguration.pageController.jumpToPage(index);
});
}
@override
void dispose() {
super.dispose();
}
6 years ago
@override
Widget build(BuildContext context) {
// 获取到当前的CalendarProvider对象,设置listen为false不需要刷新
calendarProvider = Provider.of<CalendarProvider>(context, listen: false);
CalendarConfiguration configuration =
calendarProvider.calendarConfiguration;
return PageView.builder(
onPageChanged: (position) {
//月份的变化
DateModel dateModel = configuration.monthList[position];
configuration.monthChange(dateModel.year, dateModel.month);
//
calendarProvider.lastClickDateModel = configuration.monthList[position];
//计算下高度使PageView自适应高度
// double itemHeight = MediaQuery.of(context).size.width / 7;
//
// int lineCount =
// DateUtil.getMonthViewLineCount(dateModel.year, dateModel.month);
// double newHeight = itemHeight * lineCount +
// configuration.verticalSpacing * (lineCount - 1);
// if(totalHeight!=newHeight){
// totalHeight=newHeight;
// setState(() {
//
// });
// }
},
controller: configuration.pageController,
itemBuilder: (context, index) {
DateModel dateModel = configuration.monthList[index];
return new MonthView(
year: dateModel.year,
month: dateModel.month,
minSelectDate: DateModel.fromDateTime(DateTime(
configuration.minSelectYear,
configuration.minSelectMonth,
configuration.minSelectDay)),
maxSelectDate: DateModel.fromDateTime(DateTime(
configuration.maxSelectYear,
configuration.maxSelectMonth,
configuration.maxSelectDay)),
extraDataMap: configuration.extraDataMap,
);
},
itemCount: configuration.monthList.length,
6 years ago
);
}
}