Skip to content

Commit e4ed067

Browse files
author
Liu Yanbo
committed
add date picker model factory method
1 parent 01b97d2 commit e4ed067

8 files changed

+548
-339
lines changed

.idea/workspace.xml

+276-69
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

CHANGELOG.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
## [0.0.1] - TODO: Add release date.
1+
## [0.1.0] - initial submit
22

33
* TODO: Describe initial release.

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# flutter_datetime_picker
22

3-
A new Flutter package.
3+
A flutter date time picker
44

55
## Getting Started
66

example/lib/main.dart

+44-7
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,11 @@ class HomePage extends StatelessWidget {
3939
context,
4040
showTitleActions: true,
4141
locale: 'zh',
42-
initialYear: 2018,
43-
initialMonth: 6,
44-
initialDate: 21,
45-
onChanged: (year, month, day) {
46-
print('change $year-$month-$day');
42+
onChanged: (date) {
43+
print('change $date');
4744
},
48-
onConfirm: (year, month, day) {
49-
print('confirm $year-$month-$day');
45+
onConfirm: (date) {
46+
print('confirm $date');
5047
},
5148
);
5249
},
@@ -58,3 +55,43 @@ class HomePage extends StatelessWidget {
5855
);
5956
}
6057
}
58+
59+
class hello extends StatefulWidget {
60+
@override
61+
_helloState createState() => _helloState();
62+
}
63+
64+
class _helloState extends State<hello> {
65+
@override
66+
void initState() {
67+
// TODO: implement initState
68+
super.initState();
69+
}
70+
71+
@override
72+
void dispose() {
73+
// TODO: implement dispose
74+
super.dispose();
75+
}
76+
77+
@override
78+
void didUpdateWidget(hello oldWidget) {
79+
// TODO: implement didUpdateWidget
80+
super.didUpdateWidget(oldWidget);
81+
}
82+
83+
@override
84+
void didChangeDependencies() {
85+
// TODO: implement didChangeDependencies
86+
super.didChangeDependencies();
87+
}
88+
89+
@override
90+
Widget build(BuildContext context) {
91+
return Scaffold(
92+
appBar: AppBar(
93+
title: Text(''),
94+
),
95+
);
96+
}
97+
}

flutter_datetime_picker.iml

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
<excludeFolder url="file://$MODULE_DIR$/example/.dart_tool" />
1313
<excludeFolder url="file://$MODULE_DIR$/example/.pub" />
1414
<excludeFolder url="file://$MODULE_DIR$/example/build" />
15+
<excludeFolder url="file://$MODULE_DIR$/example/ios/Flutter/flutter_assets/packages" />
1516
</content>
1617
<orderEntry type="jdk" jdkName="Android API 25 Platform" jdkType="Android SDK" />
1718
<orderEntry type="sourceFolder" forTests="false" />

lib/dateModel.dart

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

0 commit comments

Comments
 (0)