CreateDatePicker constructor

CreateDatePicker({
  1. Key? key,
  2. ViewState initialViewState = ViewState.date,
  3. DateTime? initialDate,
  4. DateTime? minDateTime,
  5. DateTime? maxDateTime,
  6. List<DateTime> restrictedDates = const [],
  7. List<String> weekLabels = const ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
  8. List<String> monthLabels = const ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
  9. double? width,
  10. double elevation = 1,
  11. Offset? popupMenuOffset,
  12. PopupMenuPosition popupMenuPosition = PopupMenuPosition.under,
  13. dynamic builder(
    1. DateTime selectedDate,
    2. ViewState viewState,
    3. Widget leftArrow,
    4. Widget rightArrow,
    5. Widget popupSelectedDate,
    6. Widget dateViewButton,
    7. Widget monthViewButton,
    8. Widget yearViewButton,
    9. Widget weekday,
    10. Widget dateMonthYear,
    11. Widget dateGrid,
    12. Widget monthGrid,
    13. Widget yearGrid,
    )?,
  14. dynamic leftArrowBuilder(
    1. dynamic previous()
    )?,
  15. dynamic rightArrowBuilder(
    1. dynamic next()
    )?,
  16. dynamic popupSelectedDateBuilder(
    1. DateTime selectedDate
    )?,
  17. dynamic dateViewButtonBuilder(
    1. dynamic selectDateView(),
    2. DateTime selectedDate,
    3. bool isSelected
    )?,
  18. dynamic monthViewButtonBuilder(
    1. dynamic selectMonthView(),
    2. DateTime selectedDate,
    3. bool isSelected
    )?,
  19. dynamic yearViewButtonBuilder(
    1. dynamic selectYearView(),
    2. DateTime selectedDate,
    3. bool isSelected
    )?,
  20. dynamic weekdayCellBuilder(
    1. String day,
    2. bool isToday
    )?,
  21. dynamic dateCellBuilder(
    1. dynamic selectdate(),
    2. bool isSelected,
    3. bool isInTheCurrentMonth,
    4. bool isAvailable,
    5. int day,
    )?,
  22. dynamic monthCellBuilder(
    1. dynamic selectMonth(),
    2. String month,
    3. bool isSelected,
    4. bool isAvailable,
    )?,
  23. dynamic yearCellBuilder(
    1. dynamic selectYear(),
    2. int year,
    3. bool isSelected,
    4. bool isAvailable,
    )?,
  24. dynamic onViewStateChanged(
    1. ViewState viewState
    )?,
  25. required dynamic onSelectedDateChanged(
    1. DateTime date
    ),
})

A customizable date picker widget that allows users to select dates, months, or years.

The CreateDatePicker widget provides a flexible and highly customizable date picker with support for restricted dates, minimum and maximum date constraints, and custom builders for various UI components.

Features:

  • Switch between date, month, and year views.
  • Restrict selectable dates using minDateTime, maxDateTime, and restrictedDates.
  • Customize the appearance of the picker using builder functions.
  • Localize week and month labels using weekLabels and monthLabels.

Example Usage:

 CreateDatePicker(
    width: 450,
    initialViewState: ViewState.date,
    initialDate: DateTime(2027, 6, 2),
    minDateTime: DateTime(2024, 5, 1),
    maxDateTime: DateTime(2029, 5, 1),
    restrictedDates: restrictedDates,
    weekLabels: weekLabels,
    monthLabels: monthLabels,
    leftArrowBuilder: _leftArrowBuilder,
    rightArrowBuilder: _rightArrowBuilder,
    dateViewButtonBuilder: _dateViewButtonBuilder,
    monthViewButtonBuilder: _monthViewButtonBuilder,
    yearViewButtonBuilder: _yearViewButtonBuilder,
    weekdayCellBuilder: _weekdayCellBuilder,
    dateCellBuilder: _dateCellBuilder,
    monthCellBuilder: _monthCellBuilder,
    yearCellBuilder: _yearCellBuilder,
    onViewStateChanged: _changeViewState,
    onSelectedDateChanged: _onSelectedDateChanged,
    builder: _createDatePickerBuilder,
 ),

Notes:

  • Ensure that weekLabels contains exactly 7 items.
  • Ensure that monthLabels contains exactly 12 items.
  • The initialDate must not be before minDateTime or after maxDateTime.
  • The initialDate must not be included in restrictedDates.

Implementation

CreateDatePicker({
  super.key,
  this.initialViewState = ViewState.date,
  this.initialDate,
  this.minDateTime,
  this.maxDateTime,
  this.restrictedDates = const [],
  this.weekLabels = const [
    'Sunday',
    'Monday',
    'Tuesday',
    'Wednesday',
    'Thursday',
    'Friday',
    'Saturday',
  ],
  this.monthLabels = const [
    'January',
    'February',
    'March',
    'April',
    'May',
    'June',
    'July',
    'August',
    'September',
    'October',
    'November',
    'December',
  ],
  this.width,
  this.elevation = 1,
  this.popupMenuOffset,
  this.popupMenuPosition = PopupMenuPosition.under,
  this.builder,
  this.leftArrowBuilder,
  this.rightArrowBuilder,
  this.popupSelectedDateBuilder,
  this.dateViewButtonBuilder,
  this.monthViewButtonBuilder,
  this.yearViewButtonBuilder,
  this.weekdayCellBuilder,
  this.dateCellBuilder,
  this.monthCellBuilder,
  this.yearCellBuilder,
  this.onViewStateChanged,
  required this.onSelectedDateChanged,
}) : assert(
       initialDate == null ||
           (minDateTime == null || !initialDate.isBefore(minDateTime)),
       'initialDate cannot be before minDateTime',
     ),
     assert(
       initialDate == null ||
           (maxDateTime == null || !initialDate.isAfter(maxDateTime)),
       'initialDate cannot be after maxDateTime',
     ),
     assert(
       initialDate == null ||
           !restrictedDates.any((restrictedDate) {
             return initialDate.year == restrictedDate.year &&
                 initialDate.month == restrictedDate.month &&
                 initialDate.day == restrictedDate.day;
           }),
       'initialDate cannot be included in restricted dates',
     ),
     assert(
       !restrictedDates.any((restrictedDate) {
         return DateTime.now().year == restrictedDate.year &&
             DateTime.now().month == restrictedDate.month &&
             DateTime.now().day == restrictedDate.day;
       }),
       'initialDate cannot be included in restricted dates',
     ),
     assert((weekLabels.length == 7), 'weekLabels must contain 7 days'),
     assert((monthLabels.length == 12), 'monthLabels must contain 12 month');