|
@@ -1,9 +1,11 @@
|
|
|
import 'dart:html';
|
|
|
|
|
|
-import 'package:calendar_view/calendar_view/calendar_util.dart';
|
|
|
+import 'package:calendar_view/calendar_controller/controller.dart';
|
|
|
+import 'package:calendar_view/utils/calendar_util.dart';
|
|
|
import 'package:calendar_view/calendar_view/month_calendar/month_calendar_item.dart';
|
|
|
import 'package:flutter/foundation.dart';
|
|
|
import 'package:flutter/material.dart';
|
|
|
+import 'package:get/get.dart';
|
|
|
|
|
|
class MonthCalendar extends StatefulWidget {
|
|
|
const MonthCalendar({super.key});
|
|
@@ -13,49 +15,15 @@ class MonthCalendar extends StatefulWidget {
|
|
|
}
|
|
|
|
|
|
class _MonthCalendarState extends State<MonthCalendar> {
|
|
|
- int currentYear = 2022;
|
|
|
- int currentMonth = 12;
|
|
|
- int selectedDayIndex = 0;
|
|
|
- int maxDaysLength = 35;
|
|
|
- List<DayStructure> daysList = [];
|
|
|
+ List<DayStructure> daysList = [];
|
|
|
+ CalendarController calendarController = Get.find<CalendarController>();
|
|
|
int _maxScheduleLines = 3;
|
|
|
double _viewHeight = 0;
|
|
|
-
|
|
|
+ int _calendarLines = 0;
|
|
|
@override
|
|
|
void initState() {
|
|
|
super.initState();
|
|
|
|
|
|
-
|
|
|
- final DateTime now = DateTime.now();
|
|
|
- currentYear = now.year;
|
|
|
- currentMonth = now.month;
|
|
|
- daysList = _countDaysList(currentYear, currentMonth);
|
|
|
- _selectToday();
|
|
|
-
|
|
|
-
|
|
|
- final List<DateTime> mockSchedule = [
|
|
|
- DateTime(2022, 12, 1),
|
|
|
- DateTime(2022, 12, 4),
|
|
|
- DateTime(2022, 12, 5),
|
|
|
- DateTime(2022, 12, 6),
|
|
|
- DateTime(2022, 12, 7),
|
|
|
- DateTime(2022, 12, 12),
|
|
|
- DateTime(2022, 12, 13),
|
|
|
- DateTime(2022, 12, 14),
|
|
|
- DateTime(2022, 12, 15),
|
|
|
- DateTime(2022, 12, 16),
|
|
|
- DateTime(2022, 12, 17),
|
|
|
- DateTime(2022, 12, 18),
|
|
|
- DateTime(2022, 12, 19),
|
|
|
- DateTime(2022, 12, 20),
|
|
|
- DateTime(2022, 12, 27),
|
|
|
- DateTime(2022, 12, 28),
|
|
|
- DateTime(2022, 12, 29),
|
|
|
- DateTime(2022, 12, 30),
|
|
|
- DateTime(2022, 12, 31),
|
|
|
- ];
|
|
|
- _setSchedule(mockSchedule);
|
|
|
-
|
|
|
|
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
|
_handleMaxScheduleLines();
|
|
@@ -69,6 +37,21 @@ class _MonthCalendarState extends State<MonthCalendar> {
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
+ daysList = calendarController.daysList;
|
|
|
+ calendarController.onDaysListChange.addListener(_onDaysListChange);
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ void dispose() {
|
|
|
+ super.dispose();
|
|
|
+ calendarController.onDaysListChange.removeListener(_onDaysListChange);
|
|
|
+ }
|
|
|
+
|
|
|
+ void _onDaysListChange(_, e) {
|
|
|
+ setState(() {
|
|
|
+ daysList = calendarController.daysList;
|
|
|
+ });
|
|
|
+ _handleMaxScheduleLines();
|
|
|
}
|
|
|
|
|
|
@override
|
|
@@ -159,162 +142,21 @@ class _MonthCalendarState extends State<MonthCalendar> {
|
|
|
),
|
|
|
child: MonthDayItem(
|
|
|
dayData: day,
|
|
|
- onSelect: (v) => _handleSelectedDayByIndex(v),
|
|
|
maxScheduleLines: _maxScheduleLines,
|
|
|
),
|
|
|
),
|
|
|
);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- List<DayStructure> _countDaysList(int year, int month) {
|
|
|
- maxDaysLength = _isNeedExtraRow(year, month) ? 42 : 35;
|
|
|
- final daysList = <DayStructure>[];
|
|
|
- final firstDay = DateTime(year, month, 1);
|
|
|
- final firstDayWeek = firstDay.weekday;
|
|
|
- final lastDay = DateTime(year, month + 1, 0);
|
|
|
- final lastDayOfMonth = lastDay.day;
|
|
|
- final lastDayOfLastMonth = DateTime(year, month, 0).day;
|
|
|
- final today = DateTime.now();
|
|
|
-
|
|
|
-
|
|
|
- final firstDayWeekIndex = (firstDayWeek) % 7;
|
|
|
- int nextMonthDay = 1;
|
|
|
-
|
|
|
-
|
|
|
- for (var i = 0; i < firstDayWeekIndex; i++) {
|
|
|
- daysList.add(
|
|
|
- DayStructure(
|
|
|
- index: i,
|
|
|
- date: DateTime(
|
|
|
- year, month - 1, lastDayOfLastMonth - firstDayWeekIndex + i + 1),
|
|
|
- isCurrentMonth: false,
|
|
|
- ),
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- for (var i = 0;
|
|
|
- (i < lastDayOfMonth) && daysList.length < maxDaysLength;
|
|
|
- i++) {
|
|
|
- daysList.add(
|
|
|
- DayStructure(
|
|
|
- index: i + firstDayWeek,
|
|
|
- date: DateTime(year, month, i + 1),
|
|
|
- isToday:
|
|
|
- today.year == year && today.month == month && today.day == i + 1,
|
|
|
- ),
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
- while (daysList.length < maxDaysLength) {
|
|
|
- daysList.add(DayStructure(
|
|
|
- index: daysList.length,
|
|
|
- date: DateTime(month == 12 ? year + 1 : year,
|
|
|
- month == 12 ? 1 : month + 1, nextMonthDay),
|
|
|
- isCurrentMonth: false,
|
|
|
- ));
|
|
|
- nextMonthDay++;
|
|
|
- }
|
|
|
- return daysList;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- bool _isNeedExtraRow(int year, int month) {
|
|
|
- final firstDay = DateTime(year, month, 1);
|
|
|
- final firstDayWeek = firstDay.weekday;
|
|
|
- final lastDay = DateTime(year, month + 1, 0);
|
|
|
- final lastDayOfMonth = lastDay.day;
|
|
|
-
|
|
|
-
|
|
|
- final firstDayWeekIndex = (firstDayWeek) % 7;
|
|
|
- return firstDayWeekIndex + lastDayOfMonth > 35;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- void _handleSelectedDayByIndex(int index) {
|
|
|
- assert(index >= 0 && index < maxDaysLength,
|
|
|
- 'index must be in 0-$maxDaysLength');
|
|
|
- assert(daysList.length == maxDaysLength,
|
|
|
- 'daysList length must be maxDaysLength');
|
|
|
- for (var element in daysList) {
|
|
|
- if (element.index == index) {
|
|
|
- element.isSelected = true;
|
|
|
- } else {
|
|
|
- element.isSelected = false;
|
|
|
- }
|
|
|
- }
|
|
|
- selectedDayIndex = index;
|
|
|
- setState(() {});
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- void _selectFirstDay() {
|
|
|
- for (var element in daysList) {
|
|
|
- if (element.isCurrentMonth) {
|
|
|
- _handleSelectedDayByIndex(element.index);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- void _selectToday() {
|
|
|
- for (var element in daysList) {
|
|
|
- if (element.isToday) {
|
|
|
- _handleSelectedDayByIndex(element.index);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- void _setSchedule(List<DateTime> scheduleList) {
|
|
|
-
|
|
|
- for (var element in scheduleList) {
|
|
|
- for (var day in daysList) {
|
|
|
- if (element.year == day.date.year &&
|
|
|
- element.month == day.date.month &&
|
|
|
- element.day == day.date.day) {
|
|
|
- day.hasSchedule = true;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- void _handleLastMonth() {
|
|
|
- if (currentMonth == 1) {
|
|
|
- currentMonth = 12;
|
|
|
- currentYear--;
|
|
|
- } else {
|
|
|
- currentMonth--;
|
|
|
- }
|
|
|
- daysList = _countDaysList(currentYear, currentMonth);
|
|
|
- _selectFirstDay();
|
|
|
- setState(() {});
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- void _handleNextMonth() {
|
|
|
- if (currentMonth == 12) {
|
|
|
- currentMonth = 1;
|
|
|
- currentYear++;
|
|
|
- } else {
|
|
|
- currentMonth++;
|
|
|
- }
|
|
|
- daysList = _countDaysList(currentYear, currentMonth);
|
|
|
- _selectFirstDay();
|
|
|
- setState(() {});
|
|
|
- }
|
|
|
-
|
|
|
|
|
|
void _handleMaxScheduleLines() {
|
|
|
final size = MediaQuery.of(context).size;
|
|
|
- if (size.height == _viewHeight) return;
|
|
|
+ if (size.height == _viewHeight &&
|
|
|
+ calendarController.calendarLines == _calendarLines) return;
|
|
|
print('计算最大日程行数');
|
|
|
_viewHeight = size.height;
|
|
|
- final gridRows = (maxDaysLength / 7).floor();
|
|
|
+ _calendarLines = calendarController.calendarLines;
|
|
|
+ final gridRows = calendarController.calendarLines;
|
|
|
final gridHeight = size.height - 100;
|
|
|
final gridItemHeight = gridHeight / gridRows;
|
|
|
final scheduleAreaHeight = gridItemHeight - 30;
|