Line data Source code
1 : import 'package:flutter/material.dart'; 2 : import 'package:flutter/rendering.dart'; 3 : 4 : import 'date_period.dart'; 5 : import 'date_picker_keys.dart'; 6 : import 'day_based_changable_picker.dart'; 7 : import 'day_picker_selection.dart'; 8 : import 'day_type.dart'; 9 : import 'i_selectable_picker.dart'; 10 : import 'styles/date_picker_styles.dart'; 11 : import 'styles/event_decoration.dart'; 12 : import 'styles/layout_settings.dart'; 13 : import 'typedefs.dart'; 14 : import 'utils.dart'; 15 : 16 : /// Date picker for range selection. 17 : class RangePicker extends StatelessWidget { 18 : /// Creates a range picker. 19 0 : RangePicker({ 20 : Key? key, 21 : required DatePeriod selectedPeriod, 22 : required DateTime firstDate, 23 : required DateTime lastDate, 24 : required this.onChanged, 25 : DateTime? initiallyShowDate, 26 : this.datePickerLayoutSettings = const DatePickerLayoutSettings(), 27 : this.datePickerStyles, 28 : this.datePickerKeys, 29 : this.selectableDayPredicate, 30 : this.onSelectionError, 31 : this.eventDecorationBuilder, 32 : this.onMonthChanged, 33 0 : }) : firstDate = DatePickerUtils.startOfTheDay(firstDate), 34 0 : lastDate = DatePickerUtils.endOfTheDay(lastDate), 35 0 : selectedPeriod = DatePeriod( 36 0 : DatePickerUtils.startOfTheDay(selectedPeriod.start), 37 0 : DatePickerUtils.endOfTheDay(selectedPeriod.end)), 38 : initiallyShowDate = initiallyShowDate == null 39 : ? null 40 0 : : DatePickerUtils.startOfTheDay(initiallyShowDate), 41 0 : super(key: key) { 42 0 : assert(!this.firstDate.isAfter(this.lastDate)); 43 0 : assert(!this.lastDate.isBefore(this.firstDate)); 44 0 : assert(!this.selectedPeriod.start.isBefore(this.firstDate)); 45 0 : assert(!this.selectedPeriod.end.isAfter(this.lastDate)); 46 0 : assert(this.initiallyShowDate == null || 47 0 : !this.initiallyShowDate!.isAfter(this.lastDate)); 48 0 : assert(this.initiallyShowDate == null || 49 0 : !this.initiallyShowDate!.isBefore(this.firstDate)); 50 : } 51 : 52 : /// The currently selected period. 53 : /// 54 : /// This date is highlighted in the picker. 55 : final DatePeriod selectedPeriod; 56 : 57 : /// Called when the user picks a week. 58 : final ValueChanged<DatePeriod> onChanged; 59 : 60 : /// Called when the error was thrown after user selection. 61 : /// (e.g. when user selected a range with one or more days 62 : /// that can't be selected) 63 : final OnSelectionError? onSelectionError; 64 : 65 : /// The earliest date the user is permitted to pick. 66 : final DateTime firstDate; 67 : 68 : /// The latest date the user is permitted to pick. 69 : final DateTime lastDate; 70 : 71 : /// Date for defining what month should be shown initially. 72 : /// 73 : /// In case of null start of the [selectedPeriod] will be shown. 74 : final DateTime? initiallyShowDate; 75 : 76 : /// Layout settings what can be customized by user 77 : final DatePickerLayoutSettings datePickerLayoutSettings; 78 : 79 : /// Some keys useful for integration tests 80 : final DatePickerKeys? datePickerKeys; 81 : 82 : /// Styles what can be customized by user 83 : final DatePickerRangeStyles? datePickerStyles; 84 : 85 : /// Function returns if day can be selected or not. 86 : final SelectableDayPredicate? selectableDayPredicate; 87 : 88 : /// Builder to get event decoration for each date. 89 : /// 90 : /// All event styles are overridden by selected styles 91 : /// except days with dayType is [DayType.notSelected]. 92 : final EventDecorationBuilder? eventDecorationBuilder; 93 : 94 : /// Called when the user changes the month. 95 : /// New DateTime object represents first day of new month and 00:00 time. 96 : final ValueChanged<DateTime>? onMonthChanged; 97 : 98 0 : @override 99 : Widget build(BuildContext context) { 100 0 : ISelectablePicker<DatePeriod> rangeSelectablePicker = RangeSelectable( 101 0 : selectedPeriod, firstDate, lastDate, 102 0 : selectableDayPredicate: selectableDayPredicate); 103 : 104 0 : return DayBasedChangeablePicker<DatePeriod>( 105 : selectablePicker: rangeSelectablePicker, 106 0 : selection: DayPickerRangeSelection(selectedPeriod), 107 0 : firstDate: firstDate, 108 0 : lastDate: lastDate, 109 0 : initiallyShownDate: initiallyShowDate, 110 0 : onChanged: onChanged, 111 0 : onSelectionError: onSelectionError, 112 0 : datePickerLayoutSettings: datePickerLayoutSettings, 113 0 : datePickerStyles: datePickerStyles ?? DatePickerRangeStyles(), 114 0 : datePickerKeys: datePickerKeys, 115 0 : eventDecorationBuilder: eventDecorationBuilder, 116 0 : onMonthChanged: onMonthChanged, 117 : ); 118 : } 119 : }