updateSelected method
when you select the dateTime ,will use this method
selectedDate
your select dateTime
Implementation
void updateSelected(DateTime selectedDate) {
// _selectedDates.sort(_sortSelectDates);
if (isMultiple) {
// multiple select
if (_selectedDates.contains(selectedDate)) {
// your select dateTime in your selectedDates
if (_isDispersion) {
// dispersion select only remove
_selectedDates.remove(selectedDate);
} else {
// //进行移除
// selectedDates.sort((a, b) =>
// a.millisecondsSinceEpoch > b.millisecondsSinceEpoch ? 0 : 1);
if (selectedDate != _selectedDates.first &&
selectedDate != _selectedDates.last) {
List<DateTime?> dateTimes = _selectedDates.toList();
final int index = dateTimes.indexOf(selectedDate);
Duration duration1 = selectedDate.difference(_selectedDates.first!);
Duration duration2 = _selectedDates.last!.difference(selectedDate);
if (duration1.inMilliseconds < duration2.inMilliseconds) {
dateTimes.removeRange(index + 1, _selectedDates.length);
} else {
dateTimes.removeRange(0, index);
}
_selectedDates.clear();
_selectedDates.addAll(dateTimes);
}
}
} else {
if (_isDispersion || _selectedDates.length < 1) {
_selectedDates.add(selectedDate);
} else {
DateTime? first;
DateTime? last;
if (_selectedDates.length == 1) {
first = _selectedDates.first;
if (first!.isBefore(selectedDate)) {
last = selectedDate;
} else {
last = first;
first = last;
}
} else {
first = _selectedDates.first;
last = _selectedDates.last;
}
if (first!.isAfter(selectedDate) &&
(last!.isAfter(selectedDate) || _selectedDates.length == 1)) {
Duration duration = first.difference(selectedDate);
final List<DateTime> addList = List.generate(duration.inDays,
(int index) => first!.subtract(Duration(days: index)));
addList.add(selectedDate);
addList.forEach((dateTime) {
if (!_selectedDates.contains(dateTime)) {
// _selectedDates.insert(0, dateTime);
_selectedDates..add(dateTime);
}
});
} else if (first.isBefore(selectedDate) &&
(last!.isBefore(selectedDate) || _selectedDates.length == 1)) {
Duration duration = selectedDate
.difference(_selectedDates.length == 1 ? first : last);
final List<DateTime> addList = List.generate(
duration.inDays,
(int index) => _selectedDates.length == 1
? first!.add(Duration(days: index))
: last!.add(Duration(days: index)));
addList.add(selectedDate);
addList.forEach((dateTIme) {
if (!_selectedDates.contains(dateTIme)) {
_selectedDates.add(dateTIme);
}
});
}
}
}
} else {
if (_selectedDates.isEmpty) {
_selectedDates.add(selectedDate);
} else {
_selectedDates.remove(_selectedDates.first);
_selectedDates.add(selectedDate);
}
}
notifyListeners();
if (!isMonthMode) {
int weekPage =
RCalendarUtils.weekDelta(firstDate, selectedDate, _localizations);
updateDisplayedDate(weekPage, mode);
}
}