diff --git a/example/lib/main.dart b/example/lib/main.dart index e812dbf1..854bd8b4 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -52,21 +52,57 @@ class _MyHomePageState extends State with TickerProviderStateMixin { final _selectedDay = DateTime.now(); _events = { - _selectedDay.subtract(Duration(days: 30)): ['Event A0', 'Event B0', 'Event C0'], + _selectedDay.subtract(Duration(days: 30)): [ + 'Event A0', + 'Event B0', + 'Event C0' + ], _selectedDay.subtract(Duration(days: 27)): ['Event A1'], - _selectedDay.subtract(Duration(days: 20)): ['Event A2', 'Event B2', 'Event C2', 'Event D2'], + _selectedDay.subtract(Duration(days: 20)): [ + 'Event A2', + 'Event B2', + 'Event C2', + 'Event D2' + ], _selectedDay.subtract(Duration(days: 16)): ['Event A3', 'Event B3'], - _selectedDay.subtract(Duration(days: 10)): ['Event A4', 'Event B4', 'Event C4'], - _selectedDay.subtract(Duration(days: 4)): ['Event A5', 'Event B5', 'Event C5'], + _selectedDay.subtract(Duration(days: 10)): [ + 'Event A4', + 'Event B4', + 'Event C4' + ], + _selectedDay.subtract(Duration(days: 4)): [ + 'Event A5', + 'Event B5', + 'Event C5' + ], _selectedDay.subtract(Duration(days: 2)): ['Event A6', 'Event B6'], _selectedDay: ['Event A7', 'Event B7', 'Event C7', 'Event D7'], - _selectedDay.add(Duration(days: 1)): ['Event A8', 'Event B8', 'Event C8', 'Event D8'], - _selectedDay.add(Duration(days: 3)): Set.from(['Event A9', 'Event A9', 'Event B9']).toList(), - _selectedDay.add(Duration(days: 7)): ['Event A10', 'Event B10', 'Event C10'], + _selectedDay.add(Duration(days: 1)): [ + 'Event A8', + 'Event B8', + 'Event C8', + 'Event D8' + ], + _selectedDay.add(Duration(days: 3)): + Set.from(['Event A9', 'Event A9', 'Event B9']).toList(), + _selectedDay.add(Duration(days: 7)): [ + 'Event A10', + 'Event B10', + 'Event C10' + ], _selectedDay.add(Duration(days: 11)): ['Event A11', 'Event B11'], - _selectedDay.add(Duration(days: 17)): ['Event A12', 'Event B12', 'Event C12', 'Event D12'], + _selectedDay.add(Duration(days: 17)): [ + 'Event A12', + 'Event B12', + 'Event C12', + 'Event D12' + ], _selectedDay.add(Duration(days: 22)): ['Event A13', 'Event B13'], - _selectedDay.add(Duration(days: 26)): ['Event A14', 'Event B14', 'Event C14'], + _selectedDay.add(Duration(days: 26)): [ + 'Event A14', + 'Event B14', + 'Event C14' + ], }; _selectedEvents = _events[_selectedDay] ?? []; @@ -87,18 +123,20 @@ class _MyHomePageState extends State with TickerProviderStateMixin { super.dispose(); } - void _onDaySelected(DateTime day, List events, List holidays) { + void _onDaySelected(DateTime day, List events) { print('CALLBACK: _onDaySelected'); setState(() { _selectedEvents = events; }); } - void _onVisibleDaysChanged(DateTime first, DateTime last, CalendarFormat format) { + void _onVisibleDaysChanged( + DateTime first, DateTime last, CalendarFormat format) { print('CALLBACK: _onVisibleDaysChanged'); } - void _onCalendarCreated(DateTime first, DateTime last, CalendarFormat format) { + void _onCalendarCreated( + DateTime first, DateTime last, CalendarFormat format) { print('CALLBACK: _onCalendarCreated'); } @@ -138,7 +176,8 @@ class _MyHomePageState extends State with TickerProviderStateMixin { outsideDaysVisible: false, ), headerStyle: HeaderStyle( - formatButtonTextStyle: TextStyle().copyWith(color: Colors.white, fontSize: 15.0), + formatButtonTextStyle: + TextStyle().copyWith(color: Colors.white, fontSize: 15.0), formatButtonDecoration: BoxDecoration( color: Colors.deepOrange[400], borderRadius: BorderRadius.circular(16.0), @@ -233,8 +272,8 @@ class _MyHomePageState extends State with TickerProviderStateMixin { return children; }, ), - onDaySelected: (date, events, holidays) { - _onDaySelected(date, events, holidays); + onDaySelected: (date, events) { + _onDaySelected(date, events); _animationController.forward(from: 0.0); }, onVisibleDaysChanged: _onVisibleDaysChanged, @@ -249,7 +288,9 @@ class _MyHomePageState extends State with TickerProviderStateMixin { shape: BoxShape.rectangle, color: _calendarController.isSelected(date) ? Colors.brown[500] - : _calendarController.isToday(date) ? Colors.brown[300] : Colors.blue[400], + : _calendarController.isToday(date) + ? Colors.brown[300] + : Colors.blue[400], ), width: 16.0, height: 16.0, @@ -294,7 +335,8 @@ class _MyHomePageState extends State with TickerProviderStateMixin { child: Text('2 weeks'), onPressed: () { setState(() { - _calendarController.setCalendarFormat(CalendarFormat.twoWeeks); + _calendarController + .setCalendarFormat(CalendarFormat.twoWeeks); }); }, ), @@ -310,7 +352,8 @@ class _MyHomePageState extends State with TickerProviderStateMixin { ), const SizedBox(height: 8.0), RaisedButton( - child: Text('Set day ${dateTime.day}-${dateTime.month}-${dateTime.year}'), + child: Text( + 'Set day ${dateTime.day}-${dateTime.month}-${dateTime.year}'), onPressed: () { _calendarController.setSelectedDay( DateTime(dateTime.year, dateTime.month, dateTime.day), @@ -330,7 +373,8 @@ class _MyHomePageState extends State with TickerProviderStateMixin { border: Border.all(width: 0.8), borderRadius: BorderRadius.circular(12.0), ), - margin: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0), + margin: + const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0), child: ListTile( title: Text(event.toString()), onTap: () => print('$event tapped!'), diff --git a/lib/src/calendar.dart b/lib/src/calendar.dart index 49119ad8..62aab19a 100644 --- a/lib/src/calendar.dart +++ b/lib/src/calendar.dart @@ -4,13 +4,15 @@ part of table_calendar; /// Callback exposing currently selected day. -typedef void OnDaySelected(DateTime day, List events, List holidays); +typedef void OnDaySelected(DateTime day, List events); /// Callback exposing currently visible days (first and last of them), as well as current `CalendarFormat`. -typedef void OnVisibleDaysChanged(DateTime first, DateTime last, CalendarFormat format); +typedef void OnVisibleDaysChanged( + DateTime first, DateTime last, CalendarFormat format); /// Callback exposing initially visible days (first and last of them), as well as initial `CalendarFormat`. -typedef void OnCalendarCreated(DateTime first, DateTime last, CalendarFormat format); +typedef void OnCalendarCreated( + DateTime first, DateTime last, CalendarFormat format); /// Signature for reacting to header gestures. Exposes current month and year as a `DateTime` object. typedef void HeaderGestureCallback(DateTime focusedDay); @@ -35,7 +37,15 @@ enum FormatAnimation { slide, scale } /// * `StartingDayOfWeek.friday`: Friday - Thursday /// * `StartingDayOfWeek.saturday`: Saturday - Friday /// * `StartingDayOfWeek.sunday`: Sunday - Saturday -enum StartingDayOfWeek { monday, tuesday, wednesday, thursday, friday, saturday, sunday } +enum StartingDayOfWeek { + monday, + tuesday, + wednesday, + thursday, + friday, + saturday, + sunday +} int _getWeekdayNumber(StartingDayOfWeek weekday) { return StartingDayOfWeek.values.indexOf(weekday) + 1; @@ -205,7 +215,8 @@ class TableCalendar extends StatefulWidget { assert(availableCalendarFormats.length <= CalendarFormat.values.length), assert(weekendDays != null), assert(weekendDays.isNotEmpty - ? weekendDays.every((day) => day >= DateTime.monday && day <= DateTime.sunday) + ? weekendDays.every( + (day) => day >= DateTime.monday && day <= DateTime.sunday) : true), super(key: key); @@ -213,7 +224,8 @@ class TableCalendar extends StatefulWidget { _TableCalendarState createState() => _TableCalendarState(); } -class _TableCalendarState extends State with SingleTickerProviderStateMixin { +class _TableCalendarState extends State + with SingleTickerProviderStateMixin { @override void initState() { super.initState(); @@ -246,7 +258,8 @@ class _TableCalendarState extends State with SingleTickerProvider } if (oldWidget.availableCalendarFormats != widget.availableCalendarFormats) { - widget.calendarController._availableCalendarFormats = widget.availableCalendarFormats; + widget.calendarController._availableCalendarFormats = + widget.availableCalendarFormats; } } @@ -255,7 +268,6 @@ class _TableCalendarState extends State with SingleTickerProvider widget.onDaySelected( day, widget.calendarController.visibleEvents[_getEventKey(day)] ?? [], - widget.calendarController.visibleHolidays[_getHolidayKey(day)] ?? [], ); } } @@ -282,9 +294,8 @@ class _TableCalendarState extends State with SingleTickerProvider void _onDayLongPressed(DateTime day) { if (widget.onDayLongPressed != null) { widget.onDayLongPressed( - day, + day, widget.calendarController.visibleEvents[_getEventKey(day)] ?? [], - widget.calendarController.visibleHolidays[_getHolidayKey(day)] ?? [], ); } } @@ -330,13 +341,19 @@ class _TableCalendarState extends State with SingleTickerProvider } bool _isDayUnavailable(DateTime day) { - return (widget.startDay != null && day.isBefore(widget.calendarController._normalizeDate(widget.startDay))) || - (widget.endDay != null && day.isAfter(widget.calendarController._normalizeDate(widget.endDay))) || + return (widget.startDay != null && + day.isBefore( + widget.calendarController._normalizeDate(widget.startDay))) || + (widget.endDay != null && + day.isAfter( + widget.calendarController._normalizeDate(widget.endDay))) || (!_isDayEnabled(day)); } bool _isDayEnabled(DateTime day) { - return widget.enabledDayPredicate == null ? true : widget.enabledDayPredicate(day); + return widget.enabledDayPredicate == null + ? true + : widget.enabledDayPredicate(day); } DateTime _getEventKey(DateTime day) { @@ -365,36 +382,43 @@ class _TableCalendarState extends State with SingleTickerProvider Widget _buildHeader() { final children = [ - widget.headerStyle.showLeftChevron ? - _CustomIconButton( - icon: widget.headerStyle.leftChevronIcon, - onTap: _selectPrevious, - margin: widget.headerStyle.leftChevronMargin, - padding: widget.headerStyle.leftChevronPadding, - ) : Container(), + widget.headerStyle.showLeftChevron + ? _CustomIconButton( + icon: widget.headerStyle.leftChevronIcon, + onTap: _selectPrevious, + margin: widget.headerStyle.leftChevronMargin, + padding: widget.headerStyle.leftChevronPadding, + ) + : Container(), Expanded( child: GestureDetector( onTap: _onHeaderTapped, onLongPress: _onHeaderLongPressed, child: Text( widget.headerStyle.titleTextBuilder != null - ? widget.headerStyle.titleTextBuilder(widget.calendarController.focusedDay, widget.locale) - : DateFormat.yMMMM(widget.locale).format(widget.calendarController.focusedDay), + ? widget.headerStyle.titleTextBuilder( + widget.calendarController.focusedDay, widget.locale) + : DateFormat.yMMMM(widget.locale) + .format(widget.calendarController.focusedDay), style: widget.headerStyle.titleTextStyle, - textAlign: widget.headerStyle.centerHeaderTitle ? TextAlign.center : TextAlign.start, + textAlign: widget.headerStyle.centerHeaderTitle + ? TextAlign.center + : TextAlign.start, ), ), ), - widget.headerStyle.showRightChevron ? - _CustomIconButton( - icon: widget.headerStyle.rightChevronIcon, - onTap: _selectNext, - margin: widget.headerStyle.rightChevronMargin, - padding: widget.headerStyle.rightChevronPadding, - ) : Container() + widget.headerStyle.showRightChevron + ? _CustomIconButton( + icon: widget.headerStyle.rightChevronIcon, + onTap: _selectNext, + margin: widget.headerStyle.rightChevronMargin, + padding: widget.headerStyle.rightChevronPadding, + ) + : Container() ]; - if (widget.headerStyle.formatButtonVisible && widget.availableCalendarFormats.length > 1) { + if (widget.headerStyle.formatButtonVisible && + widget.availableCalendarFormats.length > 1) { children.insert(2, const SizedBox(width: 8.0)); children.insert(3, _buildFormatButton()); } @@ -425,31 +449,7 @@ class _TableCalendarState extends State with SingleTickerProvider } Widget _buildCalendarContent() { - if (widget.formatAnimation == FormatAnimation.slide) { - return AnimatedSize( - duration: Duration(milliseconds: widget.calendarController.calendarFormat == CalendarFormat.month ? 330 : 220), - curve: Curves.fastOutSlowIn, - alignment: Alignment(0, -1), - vsync: this, - child: _buildWrapper(), - ); - } else { - return AnimatedSwitcher( - duration: const Duration(milliseconds: 350), - transitionBuilder: (child, animation) { - return SizeTransition( - sizeFactor: animation, - child: ScaleTransition( - scale: animation, - child: child, - ), - ); - }, - child: _buildWrapper( - key: ValueKey(widget.calendarController.calendarFormat), - ), - ); - } + return _buildWrapper(); } Widget _buildWrapper({Key key}) { @@ -488,7 +488,8 @@ class _TableCalendarState extends State with SingleTickerProvider child: child, onVerticalSwipe: (direction) { setState(() { - widget.calendarController.swipeCalendarFormat(isSwipeUp: direction == SwipeDirection.up); + widget.calendarController + .swipeCalendarFormat(isSwipeUp: direction == SwipeDirection.up); }); }, swipeConfig: widget.simpleSwipeConfig, @@ -501,8 +502,10 @@ class _TableCalendarState extends State with SingleTickerProvider switchInCurve: Curves.decelerate, transitionBuilder: (child, animation) { return SlideTransition( - position: - Tween(begin: Offset(widget.calendarController._dx, 0), end: Offset(0, 0)).animate(animation), + position: Tween( + begin: Offset(widget.calendarController._dx, 0), + end: Offset(0, 0)) + .animate(animation), child: child, ); }, @@ -525,7 +528,10 @@ class _TableCalendarState extends State with SingleTickerProvider int x = 0; while (x < widget.calendarController._visibleDays.value.length) { - children.add(_buildTableRow(widget.calendarController._visibleDays.value.skip(x).take(daysInWeek).toList())); + children.add(_buildTableRow(widget.calendarController._visibleDays.value + .skip(x) + .take(daysInWeek) + .toList())); x += daysInWeek; } @@ -539,11 +545,13 @@ class _TableCalendarState extends State with SingleTickerProvider TableRow _buildDaysOfWeek() { return TableRow( decoration: widget.daysOfWeekStyle.decoration, - children: widget.calendarController._visibleDays.value.take(7).map((date) { + children: + widget.calendarController._visibleDays.value.take(7).map((date) { final weekdayString = widget.daysOfWeekStyle.dowTextBuilder != null ? widget.daysOfWeekStyle.dowTextBuilder(date, widget.locale) : DateFormat.E(widget.locale).format(date); - final isWeekend = widget.calendarController._isWeekend(date, widget.weekendDays); + final isWeekend = + widget.calendarController._isWeekend(date, widget.weekendDays); if (isWeekend && widget.builders.dowWeekendBuilder != null) { return widget.builders.dowWeekendBuilder(context, weekdayString); @@ -554,7 +562,9 @@ class _TableCalendarState extends State with SingleTickerProvider return Center( child: Text( weekdayString, - style: isWeekend ? widget.daysOfWeekStyle.weekendStyle : widget.daysOfWeekStyle.weekdayStyle, + style: isWeekend + ? widget.daysOfWeekStyle.weekendStyle + : widget.daysOfWeekStyle.weekdayStyle, ), ); }).toList(), @@ -596,8 +606,12 @@ class _TableCalendarState extends State with SingleTickerProvider if (key != null) { final children = [content]; - final events = eventKey != null ? widget.calendarController.visibleEvents[eventKey] : []; - final holidays = holidayKey != null ? widget.calendarController.visibleHolidays[holidayKey] : []; + final events = eventKey != null + ? widget.calendarController.visibleEvents[eventKey] + : []; + final holidays = holidayKey != null + ? widget.calendarController.visibleHolidays[holidayKey] + : []; if (!_isDayUnavailable(date)) { if (widget.builders.markersBuilder != null) { @@ -632,15 +646,21 @@ class _TableCalendarState extends State with SingleTickerProvider content = Stack( alignment: widget.calendarStyle.markersAlignment, children: children, - overflow: widget.calendarStyle.canEventMarkersOverflow ? Overflow.visible : Overflow.clip, + overflow: widget.calendarStyle.canEventMarkersOverflow + ? Overflow.visible + : Overflow.clip, ); } } return GestureDetector( behavior: widget.dayHitTestBehavior, - onTap: () => _isDayUnavailable(date) ? _onUnavailableDaySelected() : _selectDay(date), - onLongPress: () => _isDayUnavailable(date) ? _onUnavailableDayLongPressed() : _onDayLongPressed(date), + onTap: () => _isDayUnavailable(date) + ? _onUnavailableDaySelected() + : _selectDay(date), + onLongPress: () => _isDayUnavailable(date) + ? _onUnavailableDayLongPressed() + : _onDayLongPressed(date), child: content, ); } @@ -652,40 +672,66 @@ class _TableCalendarState extends State with SingleTickerProvider final tIsSelected = widget.calendarController.isSelected(date); final tIsToday = widget.calendarController.isToday(date); final tIsOutside = widget.calendarController._isExtraDay(date); - final tIsHoliday = widget.calendarController.visibleHolidays.containsKey(_getHolidayKey(date)); - final tIsWeekend = widget.calendarController._isWeekend(date, widget.weekendDays); - final tIsEventDay = widget.calendarController.visibleEvents.containsKey(eventKey); - - final isUnavailable = widget.builders.unavailableDayBuilder != null && tIsUnavailable; - final isSelected = widget.builders.selectedDayBuilder != null && tIsSelected; + final tIsHoliday = widget.calendarController.visibleHolidays + .containsKey(_getHolidayKey(date)); + final tIsWeekend = + widget.calendarController._isWeekend(date, widget.weekendDays); + final tIsEventDay = + widget.calendarController.visibleEvents.containsKey(eventKey); + + final isUnavailable = + widget.builders.unavailableDayBuilder != null && tIsUnavailable; + final isSelected = + widget.builders.selectedDayBuilder != null && tIsSelected; final isToday = widget.builders.todayDayBuilder != null && tIsToday; - final isOutsideHoliday = widget.builders.outsideHolidayDayBuilder != null && tIsOutside && tIsHoliday; - final isHoliday = widget.builders.holidayDayBuilder != null && !tIsOutside && tIsHoliday; - final isOutsideWeekend = - widget.builders.outsideWeekendDayBuilder != null && tIsOutside && tIsWeekend && !tIsHoliday; - final isOutside = widget.builders.outsideDayBuilder != null && tIsOutside && !tIsWeekend && !tIsHoliday; - final isWeekend = widget.builders.weekendDayBuilder != null && !tIsOutside && tIsWeekend && !tIsHoliday; + final isOutsideHoliday = widget.builders.outsideHolidayDayBuilder != null && + tIsOutside && + tIsHoliday; + final isHoliday = + widget.builders.holidayDayBuilder != null && !tIsOutside && tIsHoliday; + final isOutsideWeekend = widget.builders.outsideWeekendDayBuilder != null && + tIsOutside && + tIsWeekend && + !tIsHoliday; + final isOutside = widget.builders.outsideDayBuilder != null && + tIsOutside && + !tIsWeekend && + !tIsHoliday; + final isWeekend = widget.builders.weekendDayBuilder != null && + !tIsOutside && + tIsWeekend && + !tIsHoliday; if (isUnavailable) { - return widget.builders.unavailableDayBuilder(context, date, widget.calendarController.visibleEvents[eventKey]); + return widget.builders.unavailableDayBuilder( + context, date, widget.calendarController.visibleEvents[eventKey]); } else if (isSelected && widget.calendarStyle.renderSelectedFirst) { - return widget.builders.selectedDayBuilder(context, date, widget.calendarController.visibleEvents[eventKey]); + return widget.builders.selectedDayBuilder( + context, date, widget.calendarController.visibleEvents[eventKey]); } else if (isToday) { - return widget.builders.todayDayBuilder(context, date, widget.calendarController.visibleEvents[eventKey]); + return widget.builders.todayDayBuilder( + context, date, widget.calendarController.visibleEvents[eventKey]); } else if (isSelected) { - return widget.builders.selectedDayBuilder(context, date, widget.calendarController.visibleEvents[eventKey]); + return widget.builders.selectedDayBuilder( + context, date, widget.calendarController.visibleEvents[eventKey]); } else if (isOutsideHoliday) { - return widget.builders.outsideHolidayDayBuilder(context, date, widget.calendarController.visibleEvents[eventKey]); + return widget.builders.outsideHolidayDayBuilder( + context, date, widget.calendarController.visibleEvents[eventKey]); } else if (isHoliday) { - return widget.builders.holidayDayBuilder(context, date, widget.calendarController.visibleEvents[eventKey]); + return widget.builders.holidayDayBuilder( + context, date, widget.calendarController.visibleEvents[eventKey]); } else if (isOutsideWeekend) { - return widget.builders.outsideWeekendDayBuilder(context, date, widget.calendarController.visibleEvents[eventKey]); + return widget.builders.outsideWeekendDayBuilder( + context, date, widget.calendarController.visibleEvents[eventKey]); } else if (isOutside) { - return widget.builders.outsideDayBuilder(context, date, widget.calendarController.visibleEvents[eventKey]); + return widget.builders.outsideDayBuilder( + context, date, widget.calendarController.visibleEvents[eventKey]); } else if (isWeekend) { - return widget.builders.weekendDayBuilder(context, date, widget.calendarController.visibleEvents[eventKey]); + return widget.builders.weekendDayBuilder( + context, date, widget.calendarController.visibleEvents[eventKey]); } else if (widget.builders.dayBuilder != null) { - return widget.builders.dayBuilder(context, date, widget.calendarController.visibleEvents[eventKey]); + return widget.builders.dayBuilder( + context, date, widget.calendarController.visibleEvents[eventKey]); } else { return _CellWidget( text: '${date.day}',