Browse Source

add date picker model factory method

Liu Yanbo 7 years ago
parent
commit
e4ed06737b
8 changed files with 548 additions and 339 deletions
  1. 276 69
      .idea/workspace.xml
  2. 1 1
      CHANGELOG.md
  3. 1 1
      README.md
  4. 44 7
      example/lib/main.dart
  5. 1 0
      flutter_datetime_picker.iml
  6. 170 0
      lib/dateModel.dart
  7. 53 259
      lib/flutter_datetime_picker.dart
  8. 2 2
      pubspec.yaml

+ 276 - 69
.idea/workspace.xml

@@ -1,7 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="ChangeListManager">
-    <list default="true" id="4ca5d027-8e00-4d4c-ab69-69171c049d48" name="Default" comment="" />
+    <list default="true" id="4ca5d027-8e00-4d4c-ab69-69171c049d48" name="Default" comment="">
+      <change beforePath="" afterPath="$PROJECT_DIR$/lib/dateModel.dart" />
+      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
+      <change beforePath="$PROJECT_DIR$/CHANGELOG.md" afterPath="$PROJECT_DIR$/CHANGELOG.md" />
+      <change beforePath="$PROJECT_DIR$/README.md" afterPath="$PROJECT_DIR$/README.md" />
+      <change beforePath="$PROJECT_DIR$/example/lib/main.dart" afterPath="$PROJECT_DIR$/example/lib/main.dart" />
+      <change beforePath="$PROJECT_DIR$/flutter_datetime_picker.iml" afterPath="$PROJECT_DIR$/flutter_datetime_picker.iml" />
+      <change beforePath="$PROJECT_DIR$/lib/flutter_datetime_picker.dart" afterPath="$PROJECT_DIR$/lib/flutter_datetime_picker.dart" />
+      <change beforePath="$PROJECT_DIR$/pubspec.yaml" afterPath="$PROJECT_DIR$/pubspec.yaml" />
+    </list>
     <ignored path="$PROJECT_DIR$/.dart_tool/" />
     <ignored path="$PROJECT_DIR$/.idea/" />
     <ignored path="$PROJECT_DIR$/.pub/" />
@@ -18,82 +27,113 @@
       <file leaf-file-name="main.dart" pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/example/lib/main.dart">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="285">
-              <caret line="40" column="29" lean-forward="false" selection-start-line="40" selection-start-column="29" selection-end-line="40" selection-end-column="29" />
+            <state relative-caret-position="297">
+              <caret line="64" column="2" lean-forward="false" selection-start-line="64" selection-start-column="2" selection-end-line="68" selection-end-column="3" />
               <folding>
                 <element signature="e#0#39#0" expanded="true" />
+                <marker date="1535682720890" expanded="true" signature="1897:2488" ph="{...}" />
               </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="date_time.dart" pinned="false" current-in-tab="false">
-        <entry file="file://$USER_HOME$/flutter/bin/cache/pkg/sky_engine/lib/core/date_time.dart">
+      <file leaf-file-name="flutter_datetime_picker.dart" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/lib/flutter_datetime_picker.dart">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="-10902">
-              <caret line="220" column="11" lean-forward="false" selection-start-line="220" selection-start-column="11" selection-end-line="220" selection-end-column="11" />
-              <folding />
+            <state relative-caret-position="695">
+              <caret line="87" column="32" lean-forward="false" selection-start-line="87" selection-start-column="32" selection-end-line="87" selection-end-column="32" />
+              <folding>
+                <element signature="e#34#74#0" expanded="true" />
+              </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="flutter_datetime_picker.dart" pinned="false" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/lib/flutter_datetime_picker.dart">
+      <file leaf-file-name="LICENSE" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/LICENSE">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="309">
-              <caret line="299" column="97" lean-forward="true" selection-start-line="299" selection-start-column="97" selection-end-line="299" selection-end-column="97" />
-              <folding>
-                <element signature="e#34#74#0" expanded="true" />
-              </folding>
+            <state relative-caret-position="0">
+              <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+              <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="picker.dart" pinned="false" current-in-tab="false">
-        <entry file="file://$USER_HOME$/flutter/packages/flutter/lib/src/cupertino/picker.dart">
+      <file leaf-file-name="pubspec.yaml" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/pubspec.yaml">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="291">
-              <caret line="85" column="18" lean-forward="false" selection-start-line="85" selection-start-column="18" selection-end-line="85" selection-end-column="18" />
+            <state relative-caret-position="-303">
+              <caret line="1" column="43" lean-forward="false" selection-start-line="1" selection-start-column="43" selection-end-line="1" selection-end-column="43" />
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="list_wheel_scroll_view.dart" pinned="false" current-in-tab="false">
-        <entry file="file://$USER_HOME$/flutter/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart">
+      <file leaf-file-name="CHANGELOG.md" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/CHANGELOG.md">
+          <provider selected="true" editor-type-id="split-provider[text-editor;MarkdownPreviewEditor]">
+            <state split_layout="SPLIT">
+              <first_editor relative-caret-position="0">
+                <caret line="0" column="9" lean-forward="false" selection-start-line="0" selection-start-column="9" selection-end-line="0" selection-end-column="9" />
+                <folding />
+              </first_editor>
+              <second_editor>
+                <markdownNavigatorState />
+              </second_editor>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="README.md" pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/README.md">
+          <provider selected="true" editor-type-id="split-provider[text-editor;MarkdownPreviewEditor]">
+            <state split_layout="SPLIT">
+              <first_editor relative-caret-position="38">
+                <caret line="2" column="26" lean-forward="false" selection-start-line="2" selection-start-column="26" selection-end-line="2" selection-end-column="26" />
+                <folding />
+              </first_editor>
+              <second_editor>
+                <markdownNavigatorState />
+              </second_editor>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="flutter_datetime_picker.iml" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/flutter_datetime_picker.iml">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="687">
-              <caret line="211" column="2" lean-forward="false" selection-start-line="211" selection-start-column="2" selection-end-line="211" selection-end-column="2" />
+            <state relative-caret-position="0">
+              <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="pubspec.yaml" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/example/pubspec.yaml">
+      <file leaf-file-name="dateModel.dart" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/lib/dateModel.dart">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="236">
-              <caret line="16" column="16" lean-forward="false" selection-start-line="16" selection-start-column="16" selection-end-line="16" selection-end-column="16" />
+            <state relative-caret-position="-205">
+              <caret line="94" column="2" lean-forward="false" selection-start-line="94" selection-start-column="2" selection-end-line="94" selection-end-column="2" />
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="framework.dart" pinned="false" current-in-tab="false">
-        <entry file="file://$USER_HOME$/flutter/packages/flutter/lib/src/widgets/framework.dart">
+      <file leaf-file-name="pattern.dart" pinned="false" current-in-tab="false">
+        <entry file="file://$USER_HOME$/flutter/bin/cache/pkg/sky_engine/lib/core/pattern.dart">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="346">
-              <caret line="3602" column="68" lean-forward="false" selection-start-line="3602" selection-start-column="35" selection-end-line="3602" selection-end-column="68" />
+            <state relative-caret-position="450">
+              <caret line="42" column="4" lean-forward="false" selection-start-line="42" selection-start-column="4" selection-end-line="42" selection-end-column="4" />
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="flutter_datetime_picker_test.dart" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/test/flutter_datetime_picker_test.dart">
+      <file leaf-file-name="picker.dart" pinned="false" current-in-tab="false">
+        <entry file="file://$USER_HOME$/flutter/packages/flutter/lib/src/cupertino/picker.dart">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="95">
-              <caret line="5" column="0" lean-forward="false" selection-start-line="5" selection-start-column="0" selection-end-line="5" selection-end-column="0" />
+            <state relative-caret-position="1520">
+              <caret line="85" column="18" lean-forward="false" selection-start-line="85" selection-start-column="18" selection-end-line="85" selection-end-column="18" />
               <folding />
             </state>
           </provider>
@@ -101,11 +141,24 @@
       </file>
     </leaf>
   </component>
+  <component name="FileTemplateManagerImpl">
+    <option name="RECENT_TEMPLATES">
+      <list>
+        <option value="Dart File" />
+      </list>
+    </option>
+  </component>
   <component name="FindInProjectRecents">
     <findStrings>
       <find>_currentYear</find>
+      <find>leapYearMonths</find>
+      <find>_setYear</find>
+      <find>initialYear</find>
     </findStrings>
   </component>
+  <component name="Git.Settings">
+    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
+  </component>
   <component name="GradleLocalSettings">
     <option name="externalProjectsViewState">
       <projects_view />
@@ -117,15 +170,23 @@
         <option value="$PROJECT_DIR$/example/pubspec.yaml" />
         <option value="$PROJECT_DIR$/test/flutter_datetime_picker_test.dart" />
         <option value="$PROJECT_DIR$/example/lib/main.dart" />
+        <option value="$PROJECT_DIR$/lib/dateModel.dart" />
         <option value="$PROJECT_DIR$/lib/flutter_datetime_picker.dart" />
+        <option value="$PROJECT_DIR$/pubspec.yaml" />
+        <option value="$PROJECT_DIR$/CHANGELOG.md" />
+        <option value="$PROJECT_DIR$/README.md" />
       </list>
     </option>
   </component>
-  <component name="ProjectFrameBounds" extendedState="6">
+  <component name="ProjectFrameBounds">
+    <option name="x" value="-13" />
     <option name="y" value="23" />
     <option name="width" value="2560" />
     <option name="height" value="1417" />
   </component>
+  <component name="ProjectLevelVcsManager" settingsEditedManually="true">
+    <ConfirmationsSetting value="2" id="Add" />
+  </component>
   <component name="ProjectView">
     <navigator currentView="ProjectPane" proportions="" version="1">
       <flattenPackages />
@@ -141,8 +202,6 @@
       <foldersAlwaysOnTop value="true" />
     </navigator>
     <panes>
-      <pane id="Scratches" />
-      <pane id="AndroidView" />
       <pane id="ProjectPane">
         <subPane>
           <expand>
@@ -182,6 +241,8 @@
       </pane>
       <pane id="Scope" />
       <pane id="PackagesPane" />
+      <pane id="AndroidView" />
+      <pane id="Scratches" />
     </panes>
   </component>
   <component name="PropertiesComponent">
@@ -310,48 +371,127 @@
     <servers />
   </component>
   <component name="ToolWindowManager">
-    <frame x="0" y="23" width="2560" height="1417" extended-state="6" />
+    <frame x="-13" y="23" width="2560" height="1417" extended-state="0" />
     <editor active="true" />
     <layout>
       <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
-      <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32974634" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Palette&#9;" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Image Layers" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
-      <window_info id="Dart Analysis" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32974634" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.007686395" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
-      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Flutter Outline" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.18261562" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.25239235" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
+      <window_info id="Palette&#9;" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Image Layers" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
+      <window_info id="Dart Analysis" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32974634" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.31821677" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Flutter Outline" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.18221691" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Capture Tool" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Designer" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2547847" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
       <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
-      <window_info id="Theme Preview" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
-      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
-      <window_info id="Flutter Inspector" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
+      <window_info id="Theme Preview" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33589548" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
+      <window_info id="Flutter Inspector" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
       <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
-      <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
       <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
       <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
-      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
-      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+      <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
       <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32974634" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
     </layout>
   </component>
   <component name="VcsContentAnnotationSettings">
     <option name="myLimit" value="2678400000" />
   </component>
   <component name="XDebuggerManager">
-    <breakpoint-manager />
+    <breakpoint-manager>
+      <option name="time" value="8" />
+    </breakpoint-manager>
     <watches-manager />
   </component>
   <component name="editorHistoryManager">
+    <entry file="file://$PROJECT_DIR$/example/lib/main.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding>
+            <element signature="e#0#39#0" expanded="true" />
+            <marker date="1535682720890" expanded="true" signature="1897:2488" ph="{...}" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$USER_HOME$/flutter/bin/cache/pkg/sky_engine/lib/core/date_time.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="4142">
+          <caret line="220" column="11" lean-forward="false" selection-start-line="220" selection-start-column="11" selection-end-line="220" selection-end-column="11" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/lib/flutter_datetime_picker.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="4959">
+          <caret line="262" column="0" lean-forward="false" selection-start-line="262" selection-start-column="0" selection-end-line="276" selection-end-column="3" />
+          <folding>
+            <element signature="e#34#74#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/lib/dateModel.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="741">
+          <caret line="39" column="34" lean-forward="true" selection-start-line="39" selection-start-column="34" selection-end-line="39" selection-end-column="34" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$USER_HOME$/flutter/packages/flutter/lib/src/cupertino/picker.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1520">
+          <caret line="85" column="18" lean-forward="false" selection-start-line="85" selection-start-column="18" selection-end-line="85" selection-end-column="18" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$USER_HOME$/flutter/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="3629">
+          <caret line="211" column="2" lean-forward="false" selection-start-line="211" selection-start-column="2" selection-end-line="211" selection-end-column="2" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/example/pubspec.yaml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="304">
+          <caret line="16" column="16" lean-forward="false" selection-start-line="16" selection-start-column="16" selection-end-line="16" selection-end-column="16" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$USER_HOME$/flutter/packages/flutter/lib/src/widgets/framework.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="68438">
+          <caret line="3602" column="68" lean-forward="false" selection-start-line="3602" selection-start-column="35" selection-end-line="3602" selection-end-column="68" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/test/flutter_datetime_picker_test.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="95">
+          <caret line="5" column="0" lean-forward="false" selection-start-line="5" selection-start-column="0" selection-end-line="5" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
     <entry file="file://$PROJECT_DIR$/example/pubspec.yaml">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="236">
+        <state relative-caret-position="304">
           <caret line="16" column="16" lean-forward="false" selection-start-line="16" selection-start-column="16" selection-end-line="16" selection-end-column="16" />
           <folding />
         </state>
@@ -367,7 +507,7 @@
     </entry>
     <entry file="file://$USER_HOME$/flutter/bin/cache/pkg/sky_engine/lib/core/date_time.dart">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="-10902">
+        <state relative-caret-position="4142">
           <caret line="220" column="11" lean-forward="false" selection-start-line="220" selection-start-column="11" selection-end-line="220" selection-end-column="11" />
           <folding />
         </state>
@@ -375,7 +515,7 @@
     </entry>
     <entry file="file://$USER_HOME$/flutter/packages/flutter/lib/src/widgets/list_wheel_scroll_view.dart">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="687">
+        <state relative-caret-position="3629">
           <caret line="211" column="2" lean-forward="false" selection-start-line="211" selection-start-column="2" selection-end-line="211" selection-end-column="2" />
           <folding />
         </state>
@@ -383,7 +523,7 @@
     </entry>
     <entry file="file://$USER_HOME$/flutter/packages/flutter/lib/src/widgets/framework.dart">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="346">
+        <state relative-caret-position="68438">
           <caret line="3602" column="68" lean-forward="false" selection-start-line="3602" selection-start-column="35" selection-end-line="3602" selection-end-column="68" />
           <folding />
         </state>
@@ -391,31 +531,98 @@
     </entry>
     <entry file="file://$USER_HOME$/flutter/packages/flutter/lib/src/cupertino/picker.dart">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="291">
+        <state relative-caret-position="1520">
           <caret line="85" column="18" lean-forward="false" selection-start-line="85" selection-start-column="18" selection-end-line="85" selection-end-column="18" />
           <folding />
         </state>
       </provider>
     </entry>
+    <entry file="file://$USER_HOME$/flutter/bin/cache/pkg/sky_engine/lib/core/pattern.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="450">
+          <caret line="42" column="4" lean-forward="false" selection-start-line="42" selection-start-column="4" selection-end-line="42" selection-end-column="4" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/flutter_datetime_picker.iml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
     <entry file="file://$PROJECT_DIR$/example/lib/main.dart">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="285">
-          <caret line="40" column="29" lean-forward="false" selection-start-line="40" selection-start-column="29" selection-end-line="40" selection-end-column="29" />
+        <state relative-caret-position="297">
+          <caret line="64" column="2" lean-forward="false" selection-start-line="64" selection-start-column="2" selection-end-line="68" selection-end-column="3" />
           <folding>
             <element signature="e#0#39#0" expanded="true" />
+            <marker date="1535682720890" expanded="true" signature="1897:2488" ph="{...}" />
           </folding>
         </state>
       </provider>
     </entry>
+    <entry file="file://$PROJECT_DIR$/lib/dateModel.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-205">
+          <caret line="94" column="2" lean-forward="false" selection-start-line="94" selection-start-column="2" selection-end-line="94" selection-end-column="2" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
     <entry file="file://$PROJECT_DIR$/lib/flutter_datetime_picker.dart">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="309">
-          <caret line="299" column="97" lean-forward="true" selection-start-line="299" selection-start-column="97" selection-end-line="299" selection-end-column="97" />
+        <state relative-caret-position="695">
+          <caret line="87" column="32" lean-forward="false" selection-start-line="87" selection-start-column="32" selection-end-line="87" selection-end-column="32" />
           <folding>
             <element signature="e#34#74#0" expanded="true" />
           </folding>
         </state>
       </provider>
     </entry>
+    <entry file="file://$PROJECT_DIR$/LICENSE">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pubspec.yaml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-303">
+          <caret line="1" column="43" lean-forward="false" selection-start-line="1" selection-start-column="43" selection-end-line="1" selection-end-column="43" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/CHANGELOG.md">
+      <provider selected="true" editor-type-id="split-provider[text-editor;MarkdownPreviewEditor]">
+        <state split_layout="SPLIT">
+          <first_editor relative-caret-position="0">
+            <caret line="0" column="9" lean-forward="false" selection-start-line="0" selection-start-column="9" selection-end-line="0" selection-end-column="9" />
+            <folding />
+          </first_editor>
+          <second_editor>
+            <markdownNavigatorState />
+          </second_editor>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/README.md">
+      <provider selected="true" editor-type-id="split-provider[text-editor;MarkdownPreviewEditor]">
+        <state split_layout="SPLIT">
+          <first_editor relative-caret-position="38">
+            <caret line="2" column="26" lean-forward="false" selection-start-line="2" selection-start-column="26" selection-end-line="2" selection-end-column="26" />
+            <folding />
+          </first_editor>
+          <second_editor>
+            <markdownNavigatorState />
+          </second_editor>
+        </state>
+      </provider>
+    </entry>
   </component>
 </project>

+ 1 - 1
CHANGELOG.md

@@ -1,3 +1,3 @@
-## [0.0.1] - TODO: Add release date.
+## [0.1.0] - initial submit
 
 * TODO: Describe initial release.

+ 1 - 1
README.md

@@ -1,6 +1,6 @@
 # flutter_datetime_picker
 
-A new Flutter package.
+A flutter date time picker
 
 ## Getting Started
 

+ 44 - 7
example/lib/main.dart

@@ -39,14 +39,11 @@ class HomePage extends StatelessWidget {
                 context,
                 showTitleActions: true,
                 locale: 'zh',
-                initialYear: 2018,
-                initialMonth: 6,
-                initialDate: 21,
-                onChanged: (year, month, day) {
-                  print('change $year-$month-$day');
+                onChanged: (date) {
+                  print('change $date');
                 },
-                onConfirm: (year, month, day) {
-                  print('confirm $year-$month-$day');
+                onConfirm: (date) {
+                  print('confirm $date');
                 },
               );
             },
@@ -58,3 +55,43 @@ class HomePage extends StatelessWidget {
     );
   }
 }
+
+class hello extends StatefulWidget {
+  @override
+  _helloState createState() => _helloState();
+}
+
+class _helloState extends State<hello> {
+  @override
+  void initState() {
+    // TODO: implement initState
+    super.initState();
+  }
+
+  @override
+  void dispose() {
+    // TODO: implement dispose
+    super.dispose();
+  }
+
+  @override
+  void didUpdateWidget(hello oldWidget) {
+    // TODO: implement didUpdateWidget
+    super.didUpdateWidget(oldWidget);
+  }
+
+  @override
+  void didChangeDependencies() {
+    // TODO: implement didChangeDependencies
+    super.didChangeDependencies();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        title: Text(''),
+      ),
+    );
+  }
+}

+ 1 - 0
flutter_datetime_picker.iml

@@ -12,6 +12,7 @@
       <excludeFolder url="file://$MODULE_DIR$/example/.dart_tool" />
       <excludeFolder url="file://$MODULE_DIR$/example/.pub" />
       <excludeFolder url="file://$MODULE_DIR$/example/build" />
+      <excludeFolder url="file://$MODULE_DIR$/example/ios/Flutter/flutter_assets/packages" />
     </content>
     <orderEntry type="jdk" jdkName="Android API 25 Platform" jdkType="Android SDK" />
     <orderEntry type="sourceFolder" forTests="false" />

+ 170 - 0
lib/dateModel.dart

@@ -0,0 +1,170 @@
+abstract class BasePickerModel {
+  String leftStringAtIndex(int index);
+  String middleStringAtIndex(int index);
+  String rightStringAtIndex(int index);
+  void setLeftIndex(int index);
+  void setMiddleIndex(int index);
+  void setRightIndex(int index);
+  int currentLeftIndex();
+  int currentMiddleIndex();
+  int currentRightIndex();
+  DateTime finalTime();
+}
+
+class CommonPickerModel extends BasePickerModel {
+  List<String> leftList;
+  List<String> middleList;
+  List<String> rightList;
+  DateTime currentTime;
+  int _currentLeftIndex;
+  int _currentMiddleIndex;
+  int _currentRightIndex;
+
+  String locale;
+  CommonPickerModel({this.currentTime, locale}) : this.locale = locale ?? 'cn';
+
+  @override
+  String leftStringAtIndex(int index) {
+    return null;
+  }
+
+  @override
+  String middleStringAtIndex(int index) {
+    return null;
+  }
+
+  @override
+  String rightStringAtIndex(int index) {
+    return null;
+  }
+
+  @override
+  int currentLeftIndex() {
+    return _currentLeftIndex;
+  }
+
+  @override
+  int currentMiddleIndex() {
+    return _currentMiddleIndex;
+  }
+
+  @override
+  int currentRightIndex() {
+    return _currentRightIndex;
+  }
+
+  @override
+  void setLeftIndex(int index) {
+    _currentLeftIndex = index;
+  }
+
+  @override
+  void setMiddleIndex(int index) {
+    _currentMiddleIndex = index;
+  }
+
+  @override
+  void setRightIndex(int index) {
+    _currentRightIndex = index;
+  }
+
+  @override
+  DateTime finalTime() {}
+}
+
+class DatePickerModel extends CommonPickerModel {
+  int maxYear;
+  int minYear;
+
+  List<int> _leapYearMonths = const <int>[1, 3, 5, 7, 8, 10, 12];
+  int _calcDateCount() {
+    final currentYear = _currentLeftIndex + minYear;
+    final currentMonth = _currentMiddleIndex + 1;
+
+    if (_leapYearMonths.contains(currentMonth)) {
+      return 31;
+    } else if (currentMonth == 2) {
+      if ((currentYear % 4 == 0 && currentYear % 100 != 0) || currentYear % 400 == 0) {
+        return 29;
+      }
+      return 28;
+    }
+    return 30;
+  }
+
+  DatePickerModel({this.maxYear = 2050, this.minYear = 1970, DateTime currentTime, String locale})
+      : super(currentTime: currentTime ?? DateTime.now(), locale: locale) {
+    _currentLeftIndex = this.currentTime.year - minYear;
+    _currentMiddleIndex = this.currentTime.month - 1;
+    _currentRightIndex = this.currentTime.day - 1;
+
+    this.leftList = List.generate(maxYear - minYear + 1, (int index) {
+      return '${minYear + index}${_localeYear()}';
+    });
+    this.middleList = List.generate(12, (int index) {
+      return '${index + 1}${_localeMonth()}';
+    });
+    this.rightList = List.generate(_calcDateCount(), (int index) {
+      return '${index + 1}${_localeDay()}';
+    });
+  }
+
+  @override
+  String leftStringAtIndex(int index) {
+    if (index >= 0 && index < leftList.length) {
+      return leftList[index];
+    } else {
+      return null;
+    }
+  }
+
+  @override
+  String middleStringAtIndex(int index) {
+    if (index >= 0 && index < middleList.length) {
+      return middleList[index];
+    } else {
+      return null;
+    }
+  }
+
+  @override
+  String rightStringAtIndex(int index) {
+    if (index >= 0 && index < rightList.length) {
+      return rightList[index];
+    } else {
+      return null;
+    }
+  }
+
+  String _localeYear() {
+    if (locale.matchAsPrefix('cn') == null) {
+      return '';
+    } else {
+      return '年';
+    }
+  }
+
+  String _localeMonth() {
+    if (locale.matchAsPrefix('cn') == null) {
+      return '';
+    } else {
+      return '月';
+    }
+  }
+
+  String _localeDay() {
+    if (locale.matchAsPrefix('cn') == null) {
+      return '';
+    } else {
+      return '日';
+    }
+  }
+
+  @override
+  DateTime finalTime() {
+    final year = _currentLeftIndex + minYear;
+    final month = _currentMiddleIndex + 1;
+    final day = _currentRightIndex + 1;
+    return DateTime(year, month, day);
+  }
+}

+ 53 - 259
lib/flutter_datetime_picker.dart

@@ -2,45 +2,22 @@ library flutter_datetime_picker;
 
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
+import 'dateModel.dart';
 
-typedef DateChangedCallback(int year, int month, int date);
+typedef DateChangedCallback(DateTime time);
+typedef String StringAtIndexCallBack(int index);
 
 const double _kDatePickerHeight = 210.0;
 const double _kDatePickerTitleHeight = 44.0;
 const double _kDatePickerItemHeight = 36.0;
 const double _kDatePickerFontSize = 18.0;
 
-const int _kDefaultMinYear = 1970;
-const int _kDefaultMaxYear = 2050;
-
-const List<String> monthNames = const <String>[
-  '1',
-  '2',
-  '3',
-  '4',
-  '5',
-  '6',
-  '7',
-  '8',
-  '9',
-  '10',
-  '11',
-  '12',
-];
-
-const List<int> leapYearMonths = const <int>[1, 3, 5, 7, 8, 10, 12];
-
 class DatePicker {
   ///
   /// Display date picker bottom sheet.
   ///
   static void showDatePicker(BuildContext context,
       {bool showTitleActions: true,
-      int minYear: _kDefaultMinYear,
-      int maxYear: _kDefaultMaxYear,
-      int initialYear: _kDefaultMinYear,
-      int initialMonth: 1,
-      int initialDate: 1,
       DateChangedCallback onChanged,
       DateChangedCallback onConfirm,
       locale: 'en_NZ'}) {
@@ -48,11 +25,6 @@ class DatePicker {
         context,
         new _DatePickerRoute(
           showTitleActions: showTitleActions,
-          minYear: minYear,
-          maxYear: maxYear,
-          initialYear: initialYear,
-          initialMonth: initialMonth,
-          initialDate: initialDate,
           onChanged: onChanged,
           onConfirm: onConfirm,
           locale: locale,
@@ -65,25 +37,22 @@ class DatePicker {
 class _DatePickerRoute<T> extends PopupRoute<T> {
   _DatePickerRoute({
     this.showTitleActions,
-    this.minYear,
-    this.maxYear,
-    this.initialYear,
-    this.initialMonth,
-    this.initialDate,
     this.onChanged,
     this.onConfirm,
     this.theme,
     this.barrierLabel,
     this.locale,
     RouteSettings settings,
-  }) : super(settings: settings);
+    pickerModel,
+  })  : this.pickerModel = pickerModel ?? DatePickerModel(),
+        super(settings: settings);
 
   final bool showTitleActions;
-  final int minYear, maxYear, initialYear, initialMonth, initialDate;
   final DateChangedCallback onChanged;
   final DateChangedCallback onConfirm;
   final ThemeData theme;
   final String locale;
+  final BasePickerModel pickerModel;
 
   @override
   Duration get transitionDuration => const Duration(milliseconds: 200);
@@ -113,14 +82,10 @@ class _DatePickerRoute<T> extends PopupRoute<T> {
       context: context,
       removeTop: true,
       child: _DatePickerComponent(
-        minYear: minYear,
-        maxYear: maxYear,
-        initialYear: initialYear,
-        initialMonth: initialMonth,
-        initialDay: initialDate,
         onChanged: onChanged,
         locale: this.locale,
         route: this,
+        pickerModel: pickerModel,
       ),
     );
     if (theme != null) {
@@ -132,64 +97,34 @@ class _DatePickerRoute<T> extends PopupRoute<T> {
 
 class _DatePickerComponent extends StatefulWidget {
   _DatePickerComponent(
-      {Key key,
-      @required this.route,
-      this.minYear: _kDefaultMinYear,
-      this.maxYear: _kDefaultMaxYear,
-      this.initialYear: -1,
-      this.initialMonth: 1,
-      this.initialDay: 1,
-      this.onChanged,
-      this.locale});
+      {Key key, @required this.route, this.onChanged, this.locale, this.pickerModel});
 
   final DateChangedCallback onChanged;
-  final int minYear, maxYear, initialYear, initialMonth, initialDay;
 
   final _DatePickerRoute route;
 
   final String locale;
 
+  final DatePickerModel pickerModel;
+
   @override
-  State<StatefulWidget> createState() => _DatePickerState(
-      this.minYear, this.maxYear, this.initialYear, this.initialMonth, this.initialDay);
+  State<StatefulWidget> createState() {
+    return _DatePickerState();
+  }
 }
 
 class _DatePickerState extends State<_DatePickerComponent> {
-  final int minYear, maxYear;
-  int _currentYear, _currentMonth, _currentDay;
-  int _dayCountOfMonth;
   FixedExtentScrollController leftScrollCtrl, middleScrollCtrl, rightScrollCtrl;
 
-  _DatePickerState(
-      this.minYear, this.maxYear, this._currentYear, this._currentMonth, this._currentDay) {
-    if (this._currentYear == -1) {
-      this._currentYear = this.minYear;
-    }
-    if (this._currentYear < this.minYear) {
-      this._currentYear = this.minYear;
-    }
-    if (this._currentYear > this.maxYear) {
-      this._currentYear = this.maxYear;
-    }
-
-    if (this._currentMonth < 1) {
-      this._currentMonth = 1;
-    }
-    if (this._currentMonth > 12) {
-      this._currentMonth = 12;
-    }
-
-    if (this._currentDay < 1) {
-      this._currentDay = 1;
-    }
-    if (this._currentDay > 31) {
-      this._currentDay = 31;
-    }
-
-    leftScrollCtrl = new FixedExtentScrollController(initialItem: _currentYear - this.minYear);
-    middleScrollCtrl = new FixedExtentScrollController(initialItem: _currentMonth - 1);
-    rightScrollCtrl = new FixedExtentScrollController(initialItem: _currentDay - 1);
-    _dayCountOfMonth = _calcDateCount();
+  @override
+  void initState() {
+    super.initState();
+    leftScrollCtrl =
+        new FixedExtentScrollController(initialItem: widget.pickerModel.currentLeftIndex());
+    middleScrollCtrl =
+        new FixedExtentScrollController(initialItem: widget.pickerModel.currentMiddleIndex());
+    rightScrollCtrl =
+        new FixedExtentScrollController(initialItem: widget.pickerModel.currentRightIndex());
   }
 
   @override
@@ -215,71 +150,9 @@ class _DatePickerState extends State<_DatePickerComponent> {
     );
   }
 
-  void _setYear(int index) {
-    int year = widget.minYear + index;
-    if (_currentYear != year) {
-      _currentYear = year;
-      _notifyDateChanged();
-    }
-  }
-
-  void _setMonth(int index) {
-    int month = index + 1;
-    if (_currentMonth != month) {
-      _currentMonth = month;
-      int dateCount = _calcDateCount();
-      if (_dayCountOfMonth != dateCount) {
-        setState(() {
-          _dayCountOfMonth = dateCount;
-        });
-      }
-      if (_currentDay > dateCount) {
-        _currentDay = dateCount;
-      }
-      _notifyDateChanged();
-    }
-  }
-
-  void _setDay(int index) {
-    int date = index + 1;
-    if (_currentDay != date) {
-      _currentDay = date;
-      _notifyDateChanged();
-    }
-  }
-
-  int _calcDateCount() {
-    if (leapYearMonths.contains(_currentMonth)) {
-      return 31;
-    } else if (_currentMonth == 2) {
-      if ((_currentYear % 4 == 0 && _currentYear % 100 != 0) || _currentYear % 400 == 0) {
-        return 29;
-      }
-      return 28;
-    }
-    return 30;
-  }
-
-  List<String> _yearList() {
-    return List.generate(widget.maxYear - widget.minYear + 1, (int index) {
-      return '${widget.minYear + index}${_localeYear()}';
-    });
-  }
-
-  List<String> _monthList() {
-    return monthNames.map((string) => '$string${_localeMonth()}').toList();
-  }
-
-  List<String> _dayList() {
-    return List.generate(_dayCountOfMonth, (int index) {
-      return '${index + 1}${_localeDay()}';
-    });
-    ;
-  }
-
   void _notifyDateChanged() {
     if (widget.onChanged != null) {
-      widget.onChanged(_currentYear, _currentMonth, _currentDay);
+      widget.onChanged(widget.pickerModel.finalTime());
     }
   }
 
@@ -296,8 +169,8 @@ class _DatePickerState extends State<_DatePickerComponent> {
     return itemView;
   }
 
-  Widget _renderColumnView(
-      List<String> lists, ScrollController scrollController, ValueChanged<int> selectedChanged) {
+  Widget _renderColumnView(StringAtIndexCallBack stringAtIndexCB, ScrollController scrollController,
+      ValueChanged<int> selectedChanged) {
     return Expanded(
       flex: 1,
       child: Container(
@@ -313,19 +186,19 @@ class _DatePickerState extends State<_DatePickerComponent> {
               },
               useMagnifier: true,
               itemBuilder: (BuildContext context, int index) {
-                if (index < lists.length && index >= 0) {
-                  return Container(
-                    height: _kDatePickerItemHeight,
-                    alignment: Alignment.center,
-                    child: Text(
-                      lists[index],
-                      style: TextStyle(color: Color(0xFF000046), fontSize: _kDatePickerFontSize),
-                      textAlign: TextAlign.start,
-                    ),
-                  );
-                } else {
+                final content = stringAtIndexCB(index);
+                if (content == null) {
                   return null;
                 }
+                return Container(
+                  height: _kDatePickerItemHeight,
+                  alignment: Alignment.center,
+                  child: Text(
+                    content,
+                    style: TextStyle(color: Color(0xFF000046), fontSize: _kDatePickerFontSize),
+                    textAlign: TextAlign.start,
+                  ),
+                );
               })),
     );
   }
@@ -334,14 +207,17 @@ class _DatePickerState extends State<_DatePickerComponent> {
     return Row(
       mainAxisAlignment: MainAxisAlignment.spaceBetween,
       children: <Widget>[
-        _renderColumnView(_yearList(), leftScrollCtrl, (year) {
-          _setYear(year);
+        _renderColumnView(widget.pickerModel.leftStringAtIndex, leftScrollCtrl, (index) {
+          widget.pickerModel.setLeftIndex(index);
+          _notifyDateChanged();
         }),
-        _renderColumnView(_monthList(), middleScrollCtrl, (month) {
-          _setMonth(month);
+        _renderColumnView(widget.pickerModel.middleStringAtIndex, middleScrollCtrl, (index) {
+          widget.pickerModel.setMiddleIndex(index);
+          _notifyDateChanged();
         }),
-        _renderColumnView(_dayList(), rightScrollCtrl, (day) {
-          _setDay(day);
+        _renderColumnView(widget.pickerModel.rightStringAtIndex, rightScrollCtrl, (index) {
+          widget.pickerModel.setRightIndex(index);
+          _notifyDateChanged();
         }),
       ],
     );
@@ -383,7 +259,7 @@ class _DatePickerState extends State<_DatePickerComponent> {
               ),
               onPressed: () {
                 if (widget.route.onConfirm != null) {
-                  widget.route.onConfirm(_currentYear, _currentMonth, _currentDay);
+                  widget.route.onConfirm(widget.pickerModel.finalTime());
                 }
                 Navigator.pop(context);
               },
@@ -395,100 +271,18 @@ class _DatePickerState extends State<_DatePickerComponent> {
   }
 
   String _localeDone() {
-    if (widget.locale == null) {
+    if (widget.locale.matchAsPrefix('cn') == null) {
       return 'Done';
-    }
-
-    String lang = widget.locale.split('_').first;
-
-    switch (lang) {
-      case 'en':
-        return 'Done';
-        break;
-
-      case 'zh':
-        return '确定';
-        break;
-
-      default:
-        return '';
-        break;
+    } else {
+      return '确定';
     }
   }
 
   String _localeCancel() {
-    if (widget.locale == null) {
+    if (widget.locale.matchAsPrefix('cn') == null) {
       return 'Cancel';
-    }
-
-    String lang = widget.locale.split('_').first;
-
-    switch (lang) {
-      case 'en':
-        return 'Cancel';
-        break;
-
-      case 'zh':
-        return '取消';
-        break;
-
-      default:
-        return '';
-        break;
-    }
-  }
-
-  String _localeYear() {
-    if (widget.locale == null) {
-      return '';
-    }
-
-    String lang = widget.locale.split('_').first;
-
-    switch (lang) {
-      case 'zh':
-        return '年';
-        break;
-
-      default:
-        return '';
-        break;
-    }
-  }
-
-  String _localeMonth() {
-    if (widget.locale == null) {
-      return '';
-    }
-
-    String lang = widget.locale.split('_').first;
-
-    switch (lang) {
-      case 'zh':
-        return '月';
-        break;
-
-      default:
-        return '';
-        break;
-    }
-  }
-
-  String _localeDay() {
-    if (widget.locale == null) {
-      return '';
-    }
-
-    String lang = widget.locale.split('_').first;
-
-    switch (lang) {
-      case 'zh':
-        return '日';
-        break;
-
-      default:
-        return '';
-        break;
+    } else {
+      return '取消';
     }
   }
 }

+ 2 - 2
pubspec.yaml

@@ -1,6 +1,6 @@
 name: flutter_datetime_picker
-description: A new Flutter package.
-version: 0.0.1
+description: A date time picker for flutter
+version: 0.1.0
 author:
 homepage: