|
|
@@ -6,59 +6,72 @@ import 'dart:math';
|
|
|
//interface for picker data model
|
|
|
abstract class BasePickerModel {
|
|
|
//a getter method for left column data, return null to end list
|
|
|
- String leftStringAtIndex(int index);
|
|
|
+ String? leftStringAtIndex(int index);
|
|
|
+
|
|
|
//a getter method for middle column data, return null to end list
|
|
|
- String middleStringAtIndex(int index);
|
|
|
+ String? middleStringAtIndex(int index);
|
|
|
+
|
|
|
//a getter method for right column data, return null to end list
|
|
|
- String rightStringAtIndex(int index);
|
|
|
+ String? rightStringAtIndex(int index);
|
|
|
+
|
|
|
//set selected left index
|
|
|
void setLeftIndex(int index);
|
|
|
+
|
|
|
//set selected middle index
|
|
|
void setMiddleIndex(int index);
|
|
|
+
|
|
|
//set selected right index
|
|
|
void setRightIndex(int index);
|
|
|
+
|
|
|
//return current left index
|
|
|
int currentLeftIndex();
|
|
|
+
|
|
|
//return current middle index
|
|
|
int currentMiddleIndex();
|
|
|
+
|
|
|
//return current right index
|
|
|
int currentRightIndex();
|
|
|
+
|
|
|
//return final time
|
|
|
- DateTime finalTime();
|
|
|
+ DateTime? finalTime();
|
|
|
+
|
|
|
//return left divider string
|
|
|
String leftDivider();
|
|
|
+
|
|
|
//return right divider string
|
|
|
String rightDivider();
|
|
|
+
|
|
|
//layout proportions for 3 columns
|
|
|
List<int> layoutProportions();
|
|
|
}
|
|
|
|
|
|
//a base class for picker data model
|
|
|
class CommonPickerModel extends BasePickerModel {
|
|
|
- List<String> leftList;
|
|
|
- List<String> middleList;
|
|
|
- List<String> rightList;
|
|
|
- DateTime currentTime;
|
|
|
- int _currentLeftIndex;
|
|
|
- int _currentMiddleIndex;
|
|
|
- int _currentRightIndex;
|
|
|
+ late List<String> leftList;
|
|
|
+ late List<String> middleList;
|
|
|
+ late List<String> rightList;
|
|
|
+ late DateTime currentTime;
|
|
|
+ late int _currentLeftIndex;
|
|
|
+ late int _currentMiddleIndex;
|
|
|
+ late int _currentRightIndex;
|
|
|
|
|
|
- LocaleType locale;
|
|
|
+ late LocaleType locale;
|
|
|
|
|
|
- CommonPickerModel({this.currentTime, locale}) : this.locale = locale ?? LocaleType.en;
|
|
|
+ CommonPickerModel({LocaleType? locale})
|
|
|
+ : this.locale = locale ?? LocaleType.en;
|
|
|
|
|
|
@override
|
|
|
- String leftStringAtIndex(int index) {
|
|
|
+ String? leftStringAtIndex(int index) {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
@override
|
|
|
- String middleStringAtIndex(int index) {
|
|
|
+ String? middleStringAtIndex(int index) {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
@override
|
|
|
- String rightStringAtIndex(int index) {
|
|
|
+ String? rightStringAtIndex(int index) {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
@@ -108,29 +121,33 @@ class CommonPickerModel extends BasePickerModel {
|
|
|
}
|
|
|
|
|
|
@override
|
|
|
- DateTime finalTime() {
|
|
|
+ DateTime? finalTime() {
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//a date picker model
|
|
|
class DatePickerModel extends CommonPickerModel {
|
|
|
- DateTime maxTime;
|
|
|
- DateTime minTime;
|
|
|
-
|
|
|
- DatePickerModel({DateTime currentTime, DateTime maxTime, DateTime minTime, LocaleType locale})
|
|
|
+ late DateTime maxTime;
|
|
|
+ late DateTime minTime;
|
|
|
+
|
|
|
+ DatePickerModel(
|
|
|
+ {DateTime? currentTime,
|
|
|
+ DateTime? maxTime,
|
|
|
+ DateTime? minTime,
|
|
|
+ LocaleType? locale})
|
|
|
: super(locale: locale) {
|
|
|
this.maxTime = maxTime ?? DateTime(2049, 12, 31);
|
|
|
this.minTime = minTime ?? DateTime(1970, 1, 1);
|
|
|
|
|
|
currentTime = currentTime ?? DateTime.now();
|
|
|
- if (currentTime != null) {
|
|
|
- if (currentTime.compareTo(this.maxTime) > 0) {
|
|
|
- currentTime = this.maxTime;
|
|
|
- } else if (currentTime.compareTo(this.minTime) < 0) {
|
|
|
- currentTime = this.minTime;
|
|
|
- }
|
|
|
+
|
|
|
+ if (currentTime.compareTo(this.maxTime) > 0) {
|
|
|
+ currentTime = this.maxTime;
|
|
|
+ } else if (currentTime.compareTo(this.minTime) < 0) {
|
|
|
+ currentTime = this.minTime;
|
|
|
}
|
|
|
+
|
|
|
this.currentTime = currentTime;
|
|
|
|
|
|
_fillLeftLists();
|
|
|
@@ -160,13 +177,17 @@ class DatePickerModel extends CommonPickerModel {
|
|
|
|
|
|
int _maxDayOfCurrentMonth() {
|
|
|
int dayCount = calcDateCount(currentTime.year, currentTime.month);
|
|
|
- return currentTime.year == maxTime.year && currentTime.month == maxTime.month
|
|
|
+ return currentTime.year == maxTime.year &&
|
|
|
+ currentTime.month == maxTime.month
|
|
|
? maxTime.day
|
|
|
: dayCount;
|
|
|
}
|
|
|
|
|
|
int _minDayOfCurrentMonth() {
|
|
|
- return currentTime.year == minTime.year && currentTime.month == minTime.month ? minTime.day : 1;
|
|
|
+ return currentTime.year == minTime.year &&
|
|
|
+ currentTime.month == minTime.month
|
|
|
+ ? minTime.day
|
|
|
+ : 1;
|
|
|
}
|
|
|
|
|
|
void _fillMiddleLists() {
|
|
|
@@ -288,7 +309,7 @@ class DatePickerModel extends CommonPickerModel {
|
|
|
}
|
|
|
|
|
|
@override
|
|
|
- String leftStringAtIndex(int index) {
|
|
|
+ String? leftStringAtIndex(int index) {
|
|
|
if (index >= 0 && index < leftList.length) {
|
|
|
return leftList[index];
|
|
|
} else {
|
|
|
@@ -297,7 +318,7 @@ class DatePickerModel extends CommonPickerModel {
|
|
|
}
|
|
|
|
|
|
@override
|
|
|
- String middleStringAtIndex(int index) {
|
|
|
+ String? middleStringAtIndex(int index) {
|
|
|
if (index >= 0 && index < middleList.length) {
|
|
|
return middleList[index];
|
|
|
} else {
|
|
|
@@ -306,7 +327,7 @@ class DatePickerModel extends CommonPickerModel {
|
|
|
}
|
|
|
|
|
|
@override
|
|
|
- String rightStringAtIndex(int index) {
|
|
|
+ String? rightStringAtIndex(int index) {
|
|
|
if (index >= 0 && index < rightList.length) {
|
|
|
return rightList[index];
|
|
|
} else {
|
|
|
@@ -330,7 +351,7 @@ class DatePickerModel extends CommonPickerModel {
|
|
|
} else if (locale == LocaleType.ko) {
|
|
|
return '$month월';
|
|
|
} else {
|
|
|
- List monthStrings = i18nObjInLocale(locale)['monthLong'];
|
|
|
+ List monthStrings = i18nObjInLocale(locale)['monthLong'] as List<String>;
|
|
|
return monthStrings[month - 1];
|
|
|
}
|
|
|
}
|
|
|
@@ -355,7 +376,8 @@ class DatePickerModel extends CommonPickerModel {
|
|
|
class TimePickerModel extends CommonPickerModel {
|
|
|
bool showSecondsColumn;
|
|
|
|
|
|
- TimePickerModel({DateTime currentTime, LocaleType locale, this.showSecondsColumn: true})
|
|
|
+ TimePickerModel(
|
|
|
+ {DateTime? currentTime, LocaleType? locale, this.showSecondsColumn: true})
|
|
|
: super(locale: locale) {
|
|
|
this.currentTime = currentTime ?? DateTime.now();
|
|
|
|
|
|
@@ -365,7 +387,7 @@ class TimePickerModel extends CommonPickerModel {
|
|
|
}
|
|
|
|
|
|
@override
|
|
|
- String leftStringAtIndex(int index) {
|
|
|
+ String? leftStringAtIndex(int index) {
|
|
|
if (index >= 0 && index < 24) {
|
|
|
return digits(index, 2);
|
|
|
} else {
|
|
|
@@ -374,7 +396,7 @@ class TimePickerModel extends CommonPickerModel {
|
|
|
}
|
|
|
|
|
|
@override
|
|
|
- String middleStringAtIndex(int index) {
|
|
|
+ String? middleStringAtIndex(int index) {
|
|
|
if (index >= 0 && index < 60) {
|
|
|
return digits(index, 2);
|
|
|
} else {
|
|
|
@@ -383,7 +405,7 @@ class TimePickerModel extends CommonPickerModel {
|
|
|
}
|
|
|
|
|
|
@override
|
|
|
- String rightStringAtIndex(int index) {
|
|
|
+ String? rightStringAtIndex(int index) {
|
|
|
if (index >= 0 && index < 60) {
|
|
|
return digits(index, 2);
|
|
|
} else {
|
|
|
@@ -415,16 +437,17 @@ class TimePickerModel extends CommonPickerModel {
|
|
|
@override
|
|
|
DateTime finalTime() {
|
|
|
return currentTime.isUtc
|
|
|
- ? DateTime.utc(currentTime.year, currentTime.month, currentTime.day, _currentLeftIndex,
|
|
|
- _currentMiddleIndex, _currentRightIndex)
|
|
|
- : DateTime(currentTime.year, currentTime.month, currentTime.day, _currentLeftIndex,
|
|
|
- _currentMiddleIndex, _currentRightIndex);
|
|
|
+ ? DateTime.utc(currentTime.year, currentTime.month, currentTime.day,
|
|
|
+ _currentLeftIndex, _currentMiddleIndex, _currentRightIndex)
|
|
|
+ : DateTime(currentTime.year, currentTime.month, currentTime.day,
|
|
|
+ _currentLeftIndex, _currentMiddleIndex, _currentRightIndex);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//a time picker model
|
|
|
class Time12hPickerModel extends CommonPickerModel {
|
|
|
- Time12hPickerModel({DateTime currentTime, LocaleType locale}) : super(locale: locale) {
|
|
|
+ Time12hPickerModel({DateTime? currentTime, LocaleType? locale})
|
|
|
+ : super(locale: locale) {
|
|
|
this.currentTime = currentTime ?? DateTime.now();
|
|
|
|
|
|
_currentLeftIndex = this.currentTime.hour % 12;
|
|
|
@@ -433,7 +456,7 @@ class Time12hPickerModel extends CommonPickerModel {
|
|
|
}
|
|
|
|
|
|
@override
|
|
|
- String leftStringAtIndex(int index) {
|
|
|
+ String? leftStringAtIndex(int index) {
|
|
|
if (index >= 0 && index < 12) {
|
|
|
if (index == 0) {
|
|
|
return digits(12, 2);
|
|
|
@@ -446,7 +469,7 @@ class Time12hPickerModel extends CommonPickerModel {
|
|
|
}
|
|
|
|
|
|
@override
|
|
|
- String middleStringAtIndex(int index) {
|
|
|
+ String? middleStringAtIndex(int index) {
|
|
|
if (index >= 0 && index < 60) {
|
|
|
return digits(index, 2);
|
|
|
} else {
|
|
|
@@ -455,11 +478,11 @@ class Time12hPickerModel extends CommonPickerModel {
|
|
|
}
|
|
|
|
|
|
@override
|
|
|
- String rightStringAtIndex(int index) {
|
|
|
+ String? rightStringAtIndex(int index) {
|
|
|
if (index == 0) {
|
|
|
- return i18nObjInLocale(this.locale)["am"];
|
|
|
+ return i18nObjInLocale(this.locale)["am"] as String?;
|
|
|
} else if (index == 1) {
|
|
|
- return i18nObjInLocale(this.locale)["pm"];
|
|
|
+ return i18nObjInLocale(this.locale)["pm"] as String?;
|
|
|
} else {
|
|
|
return null;
|
|
|
}
|
|
|
@@ -484,43 +507,52 @@ class Time12hPickerModel extends CommonPickerModel {
|
|
|
DateTime finalTime() {
|
|
|
int hour = _currentLeftIndex + 12 * _currentRightIndex;
|
|
|
return currentTime.isUtc
|
|
|
- ? DateTime.utc(
|
|
|
- currentTime.year, currentTime.month, currentTime.day, hour, _currentMiddleIndex, 0)
|
|
|
- : DateTime(
|
|
|
- currentTime.year, currentTime.month, currentTime.day, hour, _currentMiddleIndex, 0);
|
|
|
+ ? DateTime.utc(currentTime.year, currentTime.month, currentTime.day,
|
|
|
+ hour, _currentMiddleIndex, 0)
|
|
|
+ : DateTime(currentTime.year, currentTime.month, currentTime.day, hour,
|
|
|
+ _currentMiddleIndex, 0);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// a date&time picker model
|
|
|
class DateTimePickerModel extends CommonPickerModel {
|
|
|
- DateTime maxTime;
|
|
|
- DateTime minTime;
|
|
|
- DateTimePickerModel({DateTime currentTime, DateTime maxTime, DateTime minTime, LocaleType locale})
|
|
|
+ DateTime? maxTime;
|
|
|
+ DateTime? minTime;
|
|
|
+
|
|
|
+ DateTimePickerModel(
|
|
|
+ {DateTime? currentTime,
|
|
|
+ DateTime? maxTime,
|
|
|
+ DateTime? minTime,
|
|
|
+ LocaleType? locale})
|
|
|
: super(locale: locale) {
|
|
|
if (currentTime != null) {
|
|
|
this.currentTime = currentTime;
|
|
|
if (maxTime != null &&
|
|
|
- (currentTime.isBefore(maxTime) || currentTime.isAtSameMomentAs(maxTime))) {
|
|
|
+ (currentTime.isBefore(maxTime) ||
|
|
|
+ currentTime.isAtSameMomentAs(maxTime))) {
|
|
|
this.maxTime = maxTime;
|
|
|
}
|
|
|
if (minTime != null &&
|
|
|
- (currentTime.isAfter(minTime) || currentTime.isAtSameMomentAs(minTime))) {
|
|
|
+ (currentTime.isAfter(minTime) ||
|
|
|
+ currentTime.isAtSameMomentAs(minTime))) {
|
|
|
this.minTime = minTime;
|
|
|
}
|
|
|
} else {
|
|
|
this.maxTime = maxTime;
|
|
|
this.minTime = minTime;
|
|
|
var now = DateTime.now();
|
|
|
- if (this.minTime != null && this.minTime.isAfter(now)) {
|
|
|
- this.currentTime = this.minTime;
|
|
|
- } else if (this.maxTime != null && this.maxTime.isBefore(now)) {
|
|
|
- this.currentTime = this.maxTime;
|
|
|
+ if (this.minTime != null && this.minTime!.isAfter(now)) {
|
|
|
+ this.currentTime = this.minTime!;
|
|
|
+ } else if (this.maxTime != null && this.maxTime!.isBefore(now)) {
|
|
|
+ this.currentTime = this.maxTime!;
|
|
|
} else {
|
|
|
this.currentTime = now;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (this.minTime != null && this.maxTime != null && this.maxTime.isBefore(this.minTime)) {
|
|
|
+ if (this.minTime != null &&
|
|
|
+ this.maxTime != null &&
|
|
|
+ this.maxTime!.isBefore(this.minTime!)) {
|
|
|
// invalid
|
|
|
this.minTime = null;
|
|
|
this.maxTime = null;
|
|
|
@@ -529,15 +561,15 @@ class DateTimePickerModel extends CommonPickerModel {
|
|
|
_currentLeftIndex = 0;
|
|
|
_currentMiddleIndex = this.currentTime.hour;
|
|
|
_currentRightIndex = this.currentTime.minute;
|
|
|
- if (this.minTime != null && isAtSameDay(this.minTime, this.currentTime)) {
|
|
|
- _currentMiddleIndex = this.currentTime.hour - this.minTime.hour;
|
|
|
+ if (this.minTime != null && isAtSameDay(this.minTime!, this.currentTime)) {
|
|
|
+ _currentMiddleIndex = this.currentTime.hour - this.minTime!.hour;
|
|
|
if (_currentMiddleIndex == 0) {
|
|
|
- _currentRightIndex = this.currentTime.minute - this.minTime.minute;
|
|
|
+ _currentRightIndex = this.currentTime.minute - this.minTime!.minute;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- bool isAtSameDay(DateTime day1, DateTime day2) {
|
|
|
+ bool isAtSameDay(DateTime? day1, DateTime? day2) {
|
|
|
return day1 != null &&
|
|
|
day2 != null &&
|
|
|
day1.difference(day2).inDays == 0 &&
|
|
|
@@ -546,31 +578,29 @@ class DateTimePickerModel extends CommonPickerModel {
|
|
|
|
|
|
@override
|
|
|
void setLeftIndex(int index) {
|
|
|
- // TODO: implement setLeftIndex
|
|
|
super.setLeftIndex(index);
|
|
|
-
|
|
|
DateTime time = currentTime.add(Duration(days: index));
|
|
|
if (isAtSameDay(minTime, time)) {
|
|
|
- var index = min(24 - minTime.hour - 1, _currentMiddleIndex);
|
|
|
+ var index = min(24 - minTime!.hour - 1, _currentMiddleIndex);
|
|
|
this.setMiddleIndex(index);
|
|
|
} else if (isAtSameDay(maxTime, time)) {
|
|
|
- var index = min(maxTime.hour, _currentMiddleIndex);
|
|
|
+ var index = min(maxTime!.hour, _currentMiddleIndex);
|
|
|
this.setMiddleIndex(index);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@override
|
|
|
void setMiddleIndex(int index) {
|
|
|
- // TODO: implement setMiddleIndex
|
|
|
super.setMiddleIndex(index);
|
|
|
DateTime time = currentTime.add(Duration(days: _currentLeftIndex));
|
|
|
if (isAtSameDay(minTime, time) && index == 0) {
|
|
|
- var maxIndex = 60 - minTime.minute - 1;
|
|
|
+ var maxIndex = 60 - minTime!.minute - 1;
|
|
|
if (_currentRightIndex > maxIndex) {
|
|
|
_currentRightIndex = maxIndex;
|
|
|
}
|
|
|
- } else if (isAtSameDay(maxTime, time) && _currentMiddleIndex == maxTime.hour) {
|
|
|
- var maxIndex = maxTime.minute;
|
|
|
+ } else if (isAtSameDay(maxTime, time) &&
|
|
|
+ _currentMiddleIndex == maxTime!.hour) {
|
|
|
+ var maxIndex = maxTime!.minute;
|
|
|
if (_currentRightIndex > maxIndex) {
|
|
|
_currentRightIndex = maxIndex;
|
|
|
}
|
|
|
@@ -578,28 +608,32 @@ class DateTimePickerModel extends CommonPickerModel {
|
|
|
}
|
|
|
|
|
|
@override
|
|
|
- String leftStringAtIndex(int index) {
|
|
|
+ String? leftStringAtIndex(int index) {
|
|
|
DateTime time = currentTime.add(Duration(days: index));
|
|
|
- if (minTime != null && time.isBefore(minTime) && !isAtSameDay(minTime, time)) {
|
|
|
+ if (minTime != null &&
|
|
|
+ time.isBefore(minTime!) &&
|
|
|
+ !isAtSameDay(minTime!, time)) {
|
|
|
return null;
|
|
|
- } else if (maxTime != null && time.isAfter(maxTime) && !isAtSameDay(maxTime, time)) {
|
|
|
+ } else if (maxTime != null &&
|
|
|
+ time.isAfter(maxTime!) &&
|
|
|
+ !isAtSameDay(maxTime, time)) {
|
|
|
return null;
|
|
|
}
|
|
|
return formatDate(time, [ymdw], locale);
|
|
|
}
|
|
|
|
|
|
@override
|
|
|
- String middleStringAtIndex(int index) {
|
|
|
+ String? middleStringAtIndex(int index) {
|
|
|
if (index >= 0 && index < 24) {
|
|
|
DateTime time = currentTime.add(Duration(days: _currentLeftIndex));
|
|
|
if (isAtSameDay(minTime, time)) {
|
|
|
- if (index >= 0 && index < 24 - minTime.hour) {
|
|
|
- return digits(minTime.hour + index, 2);
|
|
|
+ if (index >= 0 && index < 24 - minTime!.hour) {
|
|
|
+ return digits(minTime!.hour + index, 2);
|
|
|
} else {
|
|
|
return null;
|
|
|
}
|
|
|
} else if (isAtSameDay(maxTime, time)) {
|
|
|
- if (index >= 0 && index <= maxTime.hour) {
|
|
|
+ if (index >= 0 && index <= maxTime!.hour) {
|
|
|
return digits(index, 2);
|
|
|
} else {
|
|
|
return null;
|
|
|
@@ -612,17 +646,18 @@ class DateTimePickerModel extends CommonPickerModel {
|
|
|
}
|
|
|
|
|
|
@override
|
|
|
- String rightStringAtIndex(int index) {
|
|
|
+ String? rightStringAtIndex(int index) {
|
|
|
if (index >= 0 && index < 60) {
|
|
|
DateTime time = currentTime.add(Duration(days: _currentLeftIndex));
|
|
|
if (isAtSameDay(minTime, time) && _currentMiddleIndex == 0) {
|
|
|
- if (index >= 0 && index < 60 - minTime.minute) {
|
|
|
- return digits(minTime.minute + index, 2);
|
|
|
+ if (index >= 0 && index < 60 - minTime!.minute) {
|
|
|
+ return digits(minTime!.minute + index, 2);
|
|
|
} else {
|
|
|
return null;
|
|
|
}
|
|
|
- } else if (isAtSameDay(maxTime, time) && _currentMiddleIndex >= maxTime.hour) {
|
|
|
- if (index >= 0 && index <= maxTime.minute) {
|
|
|
+ } else if (isAtSameDay(maxTime, time) &&
|
|
|
+ _currentMiddleIndex >= maxTime!.hour) {
|
|
|
+ if (index >= 0 && index <= maxTime!.minute) {
|
|
|
return digits(index, 2);
|
|
|
} else {
|
|
|
return null;
|
|
|
@@ -640,9 +675,9 @@ class DateTimePickerModel extends CommonPickerModel {
|
|
|
var hour = _currentMiddleIndex;
|
|
|
var minute = _currentRightIndex;
|
|
|
if (isAtSameDay(minTime, time)) {
|
|
|
- hour += minTime.hour;
|
|
|
- if (minTime.hour == hour) {
|
|
|
- minute += minTime.minute;
|
|
|
+ hour += minTime!.hour;
|
|
|
+ if (minTime!.hour == hour) {
|
|
|
+ minute += minTime!.minute;
|
|
|
}
|
|
|
}
|
|
|
|