dateModel.dart 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import 'dart:math';
  2. abstract class BasePickerModel {
  3. String leftStringAtIndex(int index);
  4. String middleStringAtIndex(int index);
  5. String rightStringAtIndex(int index);
  6. void setLeftIndex(int index);
  7. void setMiddleIndex(int index);
  8. void setRightIndex(int index);
  9. int currentLeftIndex();
  10. int currentMiddleIndex();
  11. int currentRightIndex();
  12. DateTime finalTime();
  13. }
  14. class CommonPickerModel extends BasePickerModel {
  15. List<String> leftList;
  16. List<String> middleList;
  17. List<String> rightList;
  18. DateTime currentTime;
  19. int _currentLeftIndex;
  20. int _currentMiddleIndex;
  21. int _currentRightIndex;
  22. String locale;
  23. CommonPickerModel({this.currentTime, locale}) : this.locale = locale ?? 'cn';
  24. @override
  25. String leftStringAtIndex(int index) {
  26. return null;
  27. }
  28. @override
  29. String middleStringAtIndex(int index) {
  30. return null;
  31. }
  32. @override
  33. String rightStringAtIndex(int index) {
  34. return null;
  35. }
  36. @override
  37. int currentLeftIndex() {
  38. return _currentLeftIndex;
  39. }
  40. @override
  41. int currentMiddleIndex() {
  42. return _currentMiddleIndex;
  43. }
  44. @override
  45. int currentRightIndex() {
  46. return _currentRightIndex;
  47. }
  48. @override
  49. void setLeftIndex(int index) {
  50. _currentLeftIndex = index;
  51. }
  52. @override
  53. void setMiddleIndex(int index) {
  54. _currentMiddleIndex = index;
  55. }
  56. @override
  57. void setRightIndex(int index) {
  58. _currentRightIndex = index;
  59. }
  60. @override
  61. DateTime finalTime() {}
  62. }
  63. class DatePickerModel extends CommonPickerModel {
  64. int maxYear;
  65. int minYear;
  66. List<int> _leapYearMonths = const <int>[1, 3, 5, 7, 8, 10, 12];
  67. int _calcDateCount(int year, int month) {
  68. if (_leapYearMonths.contains(month)) {
  69. return 31;
  70. } else if (month == 2) {
  71. if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
  72. return 29;
  73. }
  74. return 28;
  75. }
  76. return 30;
  77. }
  78. DatePickerModel({this.maxYear = 2050, this.minYear = 1970, DateTime currentTime, String locale})
  79. : super(locale: locale) {
  80. if (currentTime != null) {
  81. int year = currentTime.year;
  82. if (this.maxYear < year) {
  83. currentTime = DateTime(this.maxYear, 12, 31);
  84. } else if (this.minYear > year) {
  85. currentTime = DateTime(this.minYear, 1, 1);
  86. }
  87. }
  88. this.currentTime = currentTime ?? DateTime.now();
  89. _currentLeftIndex = this.currentTime.year - minYear;
  90. _currentMiddleIndex = this.currentTime.month - 1;
  91. _currentRightIndex = this.currentTime.day - 1;
  92. this.leftList = List.generate(maxYear - minYear + 1, (int index) {
  93. return '${minYear + index}${_localeYear()}';
  94. });
  95. this.middleList = List.generate(12, (int index) {
  96. return '${index + 1}${_localeMonth()}';
  97. });
  98. this.rightList = List.generate(
  99. _calcDateCount(_currentLeftIndex + minYear, _currentMiddleIndex + 1), (int index) {
  100. return '${index + 1}${_localeDay()}';
  101. });
  102. }
  103. @override
  104. String leftStringAtIndex(int index) {
  105. if (index >= 0 && index < leftList.length) {
  106. return leftList[index];
  107. } else {
  108. return null;
  109. }
  110. }
  111. @override
  112. String middleStringAtIndex(int index) {
  113. if (index >= 0 && index < middleList.length) {
  114. return middleList[index];
  115. } else {
  116. return null;
  117. }
  118. }
  119. @override
  120. String rightStringAtIndex(int index) {
  121. if (index >= 0 && index < rightList.length) {
  122. return rightList[index];
  123. } else {
  124. return null;
  125. }
  126. }
  127. String _localeYear() {
  128. if (locale.matchAsPrefix('cn') == null) {
  129. return '';
  130. } else {
  131. return '年';
  132. }
  133. }
  134. String _localeMonth() {
  135. if (locale.matchAsPrefix('cn') == null) {
  136. return '';
  137. } else {
  138. return '月';
  139. }
  140. }
  141. String _localeDay() {
  142. if (locale.matchAsPrefix('cn') == null) {
  143. return '';
  144. } else {
  145. return '日';
  146. }
  147. }
  148. @override
  149. DateTime finalTime() {
  150. final year = _currentLeftIndex + minYear;
  151. final month = _currentMiddleIndex + 1;
  152. final day = _currentRightIndex + 1;
  153. return DateTime(year, month, day);
  154. }
  155. }