Liu Yanbo 7 роки тому
батько
коміт
77c6268ea7

+ 154 - 113
.idea/workspace.xml

@@ -2,15 +2,18 @@
 <project version="4">
   <component name="ChangeListManager">
     <list default="true" id="4ca5d027-8e00-4d4c-ab69-69171c049d48" name="Default" comment="">
+      <change beforePath="" afterPath="$PROJECT_DIR$/lib/src/date_format.dart" />
+      <change beforePath="" afterPath="$PROJECT_DIR$/screenshot/date.png" />
+      <change beforePath="" afterPath="$PROJECT_DIR$/screenshot/datetime_chinese.png" />
+      <change beforePath="" afterPath="$PROJECT_DIR$/screenshot/datetime_english.png" />
+      <change beforePath="" afterPath="$PROJECT_DIR$/screenshot/time.png" />
       <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$/example/pubspec.lock" afterPath="$PROJECT_DIR$/example/pubspec.lock" />
-      <change beforePath="$PROJECT_DIR$/example/test/widget_test.dart" afterPath="$PROJECT_DIR$/example/test/widget_test.dart" />
-      <change beforePath="$PROJECT_DIR$/lib/dateModel.dart" afterPath="$PROJECT_DIR$/lib/dateModel.dart" />
+      <change beforePath="$PROJECT_DIR$/lib/dateModel.dart" afterPath="$PROJECT_DIR$/lib/src/dateModel.dart" />
       <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" />
-      <change beforePath="$PROJECT_DIR$/test/flutter_datetime_picker_test.dart" afterPath="$PROJECT_DIR$/test/flutter_datetime_picker_test.dart" />
     </list>
     <ignored path="$PROJECT_DIR$/.dart_tool/" />
     <ignored path="$PROJECT_DIR$/.idea/" />
@@ -28,8 +31,8 @@
       <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="804">
-              <caret line="44" column="81" lean-forward="false" selection-start-line="44" selection-start-column="81" selection-end-line="44" selection-end-column="81" />
+            <state relative-caret-position="705">
+              <caret line="83" column="55" lean-forward="true" selection-start-line="83" selection-start-column="55" selection-end-line="83" selection-end-column="55" />
               <folding>
                 <element signature="e#0#39#0" expanded="true" />
               </folding>
@@ -37,54 +40,34 @@
           </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">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="2978">
-              <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>
-      </file>
       <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="221">
-              <caret line="111" column="11" lean-forward="true" selection-start-line="111" selection-start-column="11" selection-end-line="111" selection-end-column="11" />
+            <state relative-caret-position="323">
+              <caret line="17" column="38" lean-forward="false" selection-start-line="17" selection-start-column="38" selection-end-line="17" selection-end-column="38" />
               <folding>
-                <element signature="e#34#58#0" expanded="true" />
+                <element signature="e#34#94#0" expanded="true" />
               </folding>
             </state>
           </provider>
         </entry>
       </file>
-      <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="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$/pubspec.yaml">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="57">
-              <caret line="3" column="32" lean-forward="false" selection-start-line="3" selection-start-column="32" selection-end-line="3" selection-end-column="32" />
+            <state relative-caret-position="133">
+              <caret line="7" column="24" lean-forward="false" selection-start-line="7" selection-start-column="24" selection-end-line="7" selection-end-column="24" />
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="CHANGELOG.md" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/CHANGELOG.md">
+      <file leaf-file-name="README.md" pinned="false" current-in-tab="false">
+        <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="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" />
+              <first_editor relative-caret-position="285">
+                <caret line="15" column="0" lean-forward="true" selection-start-line="15" selection-start-column="0" selection-end-line="15" selection-end-column="0" />
                 <folding />
               </first_editor>
               <second_editor>
@@ -94,12 +77,12 @@
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="README.md" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/README.md">
+      <file leaf-file-name="CHANGELOG.md" pinned="false" current-in-tab="true">
+        <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="171">
-                <caret line="9" column="0" lean-forward="true" selection-start-line="9" selection-start-column="0" selection-end-line="9" selection-end-column="0" />
+              <first_editor relative-caret-position="19">
+                <caret line="1" column="59" lean-forward="false" selection-start-line="1" selection-start-column="59" selection-end-line="1" selection-end-column="59" />
                 <folding />
               </first_editor>
               <second_editor>
@@ -109,6 +92,16 @@
           </provider>
         </entry>
       </file>
+      <file leaf-file-name="pubspec.lock" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/pubspec.lock">
+          <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>
+      </file>
       <file leaf-file-name="widget_test.dart" pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/example/test/widget_test.dart">
           <provider selected="true" editor-type-id="text-editor">
@@ -123,17 +116,29 @@
         <entry file="file://$PROJECT_DIR$/test/flutter_datetime_picker_test.dart">
           <provider selected="true" editor-type-id="text-editor">
             <state relative-caret-position="114">
-              <caret line="6" column="0" lean-forward="true" selection-start-line="0" selection-start-column="0" selection-end-line="6" selection-end-column="0" />
+              <caret line="6" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="6" selection-end-column="0" />
               <folding />
             </state>
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="dateModel.dart" pinned="false" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/lib/dateModel.dart">
+      <file leaf-file-name="dateModel.dart" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/lib/src/dateModel.dart">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="4551">
+              <caret line="281" column="3" lean-forward="true" selection-start-line="281" selection-start-column="3" selection-end-line="281" selection-end-column="3" />
+              <folding>
+                <element signature="e#0#19#0" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="date_format.dart" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/lib/src/date_format.dart">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="1430">
-              <caret line="162" column="0" lean-forward="true" selection-start-line="162" selection-start-column="0" selection-end-line="162" selection-end-column="0" />
+            <state relative-caret-position="528">
+              <caret line="252" column="32" lean-forward="true" selection-start-line="252" selection-start-column="32" selection-end-line="252" selection-end-column="32" />
               <folding />
             </state>
           </provider>
@@ -155,6 +160,10 @@
       <find>_setYear</find>
       <find>initialYear</find>
       <find>pickerModel</find>
+      <find>_renderTitleActionsView</find>
+      <find>_digits</find>
+      <find>finalTime</find>
+      <find>for</find>
     </findStrings>
   </component>
   <component name="Git.Settings">
@@ -169,14 +178,17 @@
     <option name="CHANGED_PATHS">
       <list>
         <option value="$PROJECT_DIR$/example/pubspec.yaml" />
-        <option value="$PROJECT_DIR$/CHANGELOG.md" />
-        <option value="$PROJECT_DIR$/README.md" />
         <option value="$PROJECT_DIR$/test/flutter_datetime_picker_test.dart" />
         <option value="$PROJECT_DIR$/example/test/widget_test.dart" />
-        <option value="$PROJECT_DIR$/pubspec.yaml" />
-        <option value="$PROJECT_DIR$/lib/flutter_datetime_picker.dart" />
-        <option value="$PROJECT_DIR$/example/lib/main.dart" />
         <option value="$PROJECT_DIR$/lib/dateModel.dart" />
+        <option value="$PROJECT_DIR$/lib/date_format.dart" />
+        <option value="$PROJECT_DIR$/lib/src/dateModel.dart" />
+        <option value="$PROJECT_DIR$/lib/src/date_format.dart" />
+        <option value="$PROJECT_DIR$/example/lib/main.dart" />
+        <option value="$PROJECT_DIR$/lib/flutter_datetime_picker.dart" />
+        <option value="$PROJECT_DIR$/README.md" />
+        <option value="$PROJECT_DIR$/pubspec.yaml" />
+        <option value="$PROJECT_DIR$/CHANGELOG.md" />
       </list>
     </option>
   </component>
@@ -214,24 +226,18 @@
             <path>
               <item name="flutter_datetime_picker" type="b2602c69:ProjectViewProjectNode" />
               <item name="flutter_datetime_picker" type="462c0819:PsiDirectoryNode" />
-              <item name="example" type="462c0819:PsiDirectoryNode" />
-            </path>
-            <path>
-              <item name="flutter_datetime_picker" type="b2602c69:ProjectViewProjectNode" />
-              <item name="flutter_datetime_picker" type="462c0819:PsiDirectoryNode" />
-              <item name="example" type="462c0819:PsiDirectoryNode" />
               <item name="lib" type="462c0819:PsiDirectoryNode" />
             </path>
             <path>
               <item name="flutter_datetime_picker" type="b2602c69:ProjectViewProjectNode" />
               <item name="flutter_datetime_picker" type="462c0819:PsiDirectoryNode" />
-              <item name="example" type="462c0819:PsiDirectoryNode" />
-              <item name="test" type="462c0819:PsiDirectoryNode" />
+              <item name="lib" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
             </path>
             <path>
               <item name="flutter_datetime_picker" type="b2602c69:ProjectViewProjectNode" />
               <item name="flutter_datetime_picker" type="462c0819:PsiDirectoryNode" />
-              <item name="lib" type="462c0819:PsiDirectoryNode" />
+              <item name="screenshot" type="462c0819:PsiDirectoryNode" />
             </path>
             <path>
               <item name="flutter_datetime_picker" type="b2602c69:ProjectViewProjectNode" />
@@ -259,6 +265,13 @@
     <property name="show.migrate.to.gradle.popup" value="false" />
     <property name="io.flutter.reload.alreadyRun" value="true" />
   </component>
+  <component name="RecentsManager">
+    <key name="MoveFile.RECENT_KEYS">
+      <recent name="$PROJECT_DIR$/screenshot" />
+      <recent name="$PROJECT_DIR$/lib/src" />
+      <recent name="$PROJECT_DIR$/lib" />
+    </key>
+  </component>
   <component name="RunDashboard">
     <option name="ruleStates">
       <list>
@@ -383,7 +396,14 @@
       <option name="project" value="LOCAL" />
       <updated>1535683976212</updated>
     </task>
-    <option name="localTasksCounter" value="2" />
+    <task id="LOCAL-00002" summary="fix bug">
+      <created>1535685163633</created>
+      <option name="number" value="00002" />
+      <option name="presentableId" value="LOCAL-00002" />
+      <option name="project" value="LOCAL" />
+      <updated>1535685163633</updated>
+    </task>
+    <option name="localTasksCounter" value="3" />
     <servers />
   </component>
   <component name="ToolWindowManager">
@@ -391,24 +411,24 @@
     <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="true" show_stripe_button="true" weight="0.12605688" sideWeight="0.5" order="7" 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.12605688" sideWeight="0.5" order="7" 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="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="false" show_stripe_button="true" weight="0.31821677" sideWeight="0.5" order="2" side_tool="false" 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.1360492" 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.2313605" 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.132206" 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="Flutter Outline" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 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="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.19138756" 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="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="Flutter Inspector" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32974482" 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="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" />
@@ -423,11 +443,12 @@
   </component>
   <component name="VcsManagerConfiguration">
     <MESSAGE value="add date picker model factory method" />
-    <option name="LAST_COMMIT_MESSAGE" value="add date picker model factory method" />
+    <MESSAGE value="fix bug" />
+    <option name="LAST_COMMIT_MESSAGE" value="fix bug" />
   </component>
   <component name="XDebuggerManager">
     <breakpoint-manager>
-      <option name="time" value="8" />
+      <option name="time" value="9" />
     </breakpoint-manager>
     <watches-manager />
   </component>
@@ -455,16 +476,18 @@
         <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#58#0" expanded="true" />
+            <element signature="e#34#94#0" expanded="true" />
           </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lib/dateModel.dart">
+    <entry file="file://$PROJECT_DIR$/lib/src/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 />
+          <folding>
+            <element signature="e#0#19#0" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
@@ -564,52 +587,44 @@
         </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>
+    <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="256">
+          <caret line="179" column="2" lean-forward="false" selection-start-line="179" selection-start-column="2" selection-end-line="179" selection-end-column="2" />
+          <folding />
         </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="171">
-            <caret line="9" column="0" lean-forward="true" selection-start-line="9" selection-start-column="0" selection-end-line="9" selection-end-column="0" />
-            <folding />
-          </first_editor>
-          <second_editor>
-            <markdownNavigatorState />
-          </second_editor>
+    <entry file="file://$PROJECT_DIR$/example/test/widget_test.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="228">
+          <caret line="12" column="72" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="14" selection-end-column="0" />
+          <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/pubspec.yaml">
+    <entry file="file://$PROJECT_DIR$/lib/src/dateModel.dart">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="57">
-          <caret line="3" column="32" lean-forward="false" selection-start-line="3" selection-start-column="32" selection-end-line="3" selection-end-column="32" />
-          <folding />
+        <state relative-caret-position="4551">
+          <caret line="281" column="3" lean-forward="true" selection-start-line="281" selection-start-column="3" selection-end-line="281" selection-end-column="3" />
+          <folding>
+            <element signature="e#0#19#0" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$USER_HOME$/flutter/bin/cache/pkg/sky_engine/lib/core/date_time.dart">
+    <entry file="file://$PROJECT_DIR$/lib/src/date_format.dart">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="2978">
-          <caret line="220" column="11" lean-forward="false" selection-start-line="220" selection-start-column="11" selection-end-line="220" selection-end-column="11" />
+        <state relative-caret-position="528">
+          <caret line="252" column="32" lean-forward="true" selection-start-line="252" selection-start-column="32" selection-end-line="252" selection-end-column="32" />
           <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="804">
-          <caret line="44" column="81" lean-forward="false" selection-start-line="44" selection-start-column="81" selection-end-line="44" selection-end-column="81" />
+        <state relative-caret-position="705">
+          <caret line="83" column="55" lean-forward="true" selection-start-line="83" selection-start-column="55" selection-end-line="83" selection-end-column="55" />
           <folding>
             <element signature="e#0#39#0" expanded="true" />
           </folding>
@@ -619,36 +634,62 @@
     <entry file="file://$PROJECT_DIR$/test/flutter_datetime_picker_test.dart">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="114">
-          <caret line="6" column="0" lean-forward="true" selection-start-line="0" selection-start-column="0" selection-end-line="6" selection-end-column="0" />
+          <caret line="6" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="6" selection-end-column="0" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/example/test/widget_test.dart">
+    <entry file="file://$PROJECT_DIR$/lib/flutter_datetime_picker.dart">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="228">
-          <caret line="12" column="72" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="14" selection-end-column="0" />
-          <folding />
+        <state relative-caret-position="323">
+          <caret line="17" column="38" lean-forward="false" selection-start-line="17" selection-start-column="38" selection-end-line="17" selection-end-column="38" />
+          <folding>
+            <element signature="e#34#94#0" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lib/flutter_datetime_picker.dart">
+    <entry file="file://$PROJECT_DIR$/pubspec.lock">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="221">
-          <caret line="111" column="11" lean-forward="true" selection-start-line="111" selection-start-column="11" selection-end-line="111" selection-end-column="11" />
-          <folding>
-            <element signature="e#34#58#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>
-    <entry file="file://$PROJECT_DIR$/lib/dateModel.dart">
+    <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="285">
+            <caret line="15" column="0" lean-forward="true" selection-start-line="15" selection-start-column="0" selection-end-line="15" selection-end-column="0" />
+            <folding />
+          </first_editor>
+          <second_editor>
+            <markdownNavigatorState />
+          </second_editor>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pubspec.yaml">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="1430">
-          <caret line="162" column="0" lean-forward="true" selection-start-line="162" selection-start-column="0" selection-end-line="162" selection-end-column="0" />
+        <state relative-caret-position="133">
+          <caret line="7" column="24" lean-forward="false" selection-start-line="7" selection-start-column="24" selection-end-line="7" selection-end-column="24" />
           <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="19">
+            <caret line="1" column="59" lean-forward="false" selection-start-line="1" selection-start-column="59" selection-end-line="1" selection-end-column="59" />
+            <folding />
+          </first_editor>
+          <second_editor>
+            <markdownNavigatorState />
+          </second_editor>
+        </state>
+      </provider>
+    </entry>
   </component>
 </project>

+ 1 - 2
CHANGELOG.md

@@ -1,3 +1,2 @@
 ## [0.1.0] - initial submit
-
-* TODO: Describe initial release.
+## [0.1.1] - add time picker and date time picker, add i18n

+ 6 - 0
README.md

@@ -2,6 +2,12 @@
 
 A flutter date time picker inspired by [flutter-cupertino-date-picker](https://github.com/wuzhendev/flutter-cupertino-date-picker)
 
+you can choose date / time / date&time in English and Chinese, and you can also custom your own picker content
+
+| Date picker | Time picker | Date & Time picker (Chinese) | Date & Time  picker (English-America)|
+| --- | ------- |--- | ------- |
+|![](screenshot/date.png)|![](screenshot/time.png)|![](screenshot/datetime_chinese.png)|![](screenshot/datetime_english.png)|
+
 ## Getting Started
 
 For help getting started with Flutter, view our online [documentation](https://flutter.io/).

+ 52 - 15
example/lib/main.dart

@@ -33,21 +33,58 @@ class HomePage extends StatelessWidget {
         title: Text('Datetime Picker'),
       ),
       body: Center(
-        child: FlatButton(
-            onPressed: () {
-              DatePicker.showDatePicker(context, showTitleActions: true, locale: 'zh',
-                  onChanged: (date) {
-                print('change $date');
-              }, onConfirm: (date) {
-                print('confirm $date');
-              },
-                  pickerModel: DatePickerModel(
-                      minYear: 2000, maxYear: 2019, currentTime: DateTime(2017, 93)));
-            },
-            child: Text(
-              'show date time picker',
-              style: TextStyle(color: Colors.blue),
-            )),
+        child: Column(
+          children: <Widget>[
+            FlatButton(
+                onPressed: () {
+                  DatePicker.showDatePicker(context, showTitleActions: true, onChanged: (date) {
+                    print('change $date');
+                  }, onConfirm: (date) {
+                    print('confirm $date');
+                  }, currentTime: DateTime(2008, 12, 31, 23, 12, 34), locale: 'zh');
+                },
+                child: Text(
+                  'show date picker',
+                  style: TextStyle(color: Colors.blue),
+                )),
+            FlatButton(
+                onPressed: () {
+                  DatePicker.showTimePicker(context, showTitleActions: true, onChanged: (date) {
+                    print('change $date');
+                  }, onConfirm: (date) {
+                    print('confirm $date');
+                  }, currentTime: DateTime(2008, 12, 31, 23, 12, 34));
+                },
+                child: Text(
+                  'show time picker',
+                  style: TextStyle(color: Colors.blue),
+                )),
+            FlatButton(
+                onPressed: () {
+                  DatePicker.showDateTimePicker(context, showTitleActions: true, onChanged: (date) {
+                    print('change $date');
+                  }, onConfirm: (date) {
+                    print('confirm $date');
+                  }, currentTime: DateTime(2008, 12, 31, 23, 12, 34), locale: 'zh');
+                },
+                child: Text(
+                  'show date time picker (Chinese)',
+                  style: TextStyle(color: Colors.blue),
+                )),
+            FlatButton(
+                onPressed: () {
+                  DatePicker.showDateTimePicker(context, showTitleActions: true, onChanged: (date) {
+                    print('change $date');
+                  }, onConfirm: (date) {
+                    print('confirm $date');
+                  }, currentTime: DateTime(2008, 12, 31, 23, 12, 34));
+                },
+                child: Text(
+                  'show date time picker (English-America)',
+                  style: TextStyle(color: Colors.blue),
+                )),
+          ],
+        ),
       ),
     );
   }

+ 99 - 22
lib/flutter_datetime_picker.dart

@@ -1,9 +1,9 @@
 library flutter_datetime_picker;
 
-export 'dateModel.dart';
+export 'package:flutter_datetime_picker/src/dateModel.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
-import 'dateModel.dart';
+import 'package:flutter_datetime_picker/src/dateModel.dart';
 
 typedef DateChangedCallback(DateTime time);
 typedef String StringAtIndexCallBack(int index);
@@ -21,7 +21,70 @@ class DatePicker {
       {bool showTitleActions: true,
       DateChangedCallback onChanged,
       DateChangedCallback onConfirm,
-      locale: 'en_NZ',
+      locale: 'en',
+      DateTime currentTime}) {
+    Navigator.push(
+        context,
+        new _DatePickerRoute(
+            showTitleActions: showTitleActions,
+            onChanged: onChanged,
+            onConfirm: onConfirm,
+            locale: locale,
+            theme: Theme.of(context, shadowThemeOnly: true),
+            barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
+            pickerModel: DatePickerModel(currentTime: currentTime, locale: locale)));
+  }
+
+  ///
+  /// Display time picker bottom sheet.
+  ///
+  static void showTimePicker(BuildContext context,
+      {bool showTitleActions: true,
+      DateChangedCallback onChanged,
+      DateChangedCallback onConfirm,
+      locale: 'en',
+      DateTime currentTime}) {
+    Navigator.push(
+        context,
+        new _DatePickerRoute(
+            showTitleActions: showTitleActions,
+            onChanged: onChanged,
+            onConfirm: onConfirm,
+            locale: locale,
+            theme: Theme.of(context, shadowThemeOnly: true),
+            barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
+            pickerModel: TimePickerModel(currentTime: currentTime, locale: locale)));
+  }
+
+  ///
+  /// Display date&time picker bottom sheet.
+  ///
+  static void showDateTimePicker(BuildContext context,
+      {bool showTitleActions: true,
+      DateChangedCallback onChanged,
+      DateChangedCallback onConfirm,
+      locale: 'en',
+      DateTime currentTime}) {
+    Navigator.push(
+        context,
+        new _DatePickerRoute(
+            showTitleActions: showTitleActions,
+            onChanged: onChanged,
+            onConfirm: onConfirm,
+            locale: locale,
+            theme: Theme.of(context, shadowThemeOnly: true),
+            barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
+            pickerModel: DateTimePickerModel(currentTime: currentTime, locale: locale)));
+  }
+
+  ///
+  /// Display date picker bottom sheet witch custom picker model.
+  ///
+  static void showPicker(BuildContext context,
+      {bool showTitleActions: true,
+      DateChangedCallback onChanged,
+      DateChangedCallback onConfirm,
+      locale: 'en',
       BasePickerModel pickerModel}) {
     Navigator.push(
         context,
@@ -107,7 +170,7 @@ class _DatePickerComponent extends StatefulWidget {
 
   final String locale;
 
-  final DatePickerModel pickerModel;
+  final BasePickerModel pickerModel;
 
   @override
   State<StatefulWidget> createState() {
@@ -172,9 +235,9 @@ class _DatePickerState extends State<_DatePickerComponent> {
   }
 
   Widget _renderColumnView(StringAtIndexCallBack stringAtIndexCB, ScrollController scrollController,
-      ValueChanged<int> selectedChanged) {
+      int layoutProportion, ValueChanged<int> selectedChanged) {
     return Expanded(
-      flex: 1,
+      flex: layoutProportion,
       child: Container(
           padding: EdgeInsets.all(8.0),
           height: _kDatePickerHeight,
@@ -206,22 +269,36 @@ class _DatePickerState extends State<_DatePickerComponent> {
   }
 
   Widget _renderItemView() {
-    return Row(
-      mainAxisAlignment: MainAxisAlignment.spaceBetween,
-      children: <Widget>[
-        _renderColumnView(widget.pickerModel.leftStringAtIndex, leftScrollCtrl, (index) {
-          widget.pickerModel.setLeftIndex(index);
-          _notifyDateChanged();
-        }),
-        _renderColumnView(widget.pickerModel.middleStringAtIndex, middleScrollCtrl, (index) {
-          widget.pickerModel.setMiddleIndex(index);
-          _notifyDateChanged();
-        }),
-        _renderColumnView(widget.pickerModel.rightStringAtIndex, rightScrollCtrl, (index) {
-          widget.pickerModel.setRightIndex(index);
-          _notifyDateChanged();
-        }),
-      ],
+    return Container(
+      color: Colors.white,
+      child: Row(
+        mainAxisAlignment: MainAxisAlignment.spaceBetween,
+        children: <Widget>[
+          _renderColumnView(widget.pickerModel.leftStringAtIndex, leftScrollCtrl,
+              widget.pickerModel.layoutProportions()[0], (index) {
+            widget.pickerModel.setLeftIndex(index);
+            _notifyDateChanged();
+          }),
+          Text(
+            widget.pickerModel.leftDivider(),
+            style: TextStyle(color: Color(0xFF000046), fontSize: _kDatePickerFontSize),
+          ),
+          _renderColumnView(widget.pickerModel.middleStringAtIndex, middleScrollCtrl,
+              widget.pickerModel.layoutProportions()[1], (index) {
+            widget.pickerModel.setMiddleIndex(index);
+            _notifyDateChanged();
+          }),
+          Text(
+            widget.pickerModel.rightDivider(),
+            style: TextStyle(color: Color(0xFF000046), fontSize: _kDatePickerFontSize),
+          ),
+          _renderColumnView(widget.pickerModel.rightStringAtIndex, rightScrollCtrl,
+              widget.pickerModel.layoutProportions()[2], (index) {
+            widget.pickerModel.setRightIndex(index);
+            _notifyDateChanged();
+          }),
+        ],
+      ),
     );
   }
 

+ 124 - 4
lib/dateModel.dart → lib/src/dateModel.dart

@@ -1,4 +1,5 @@
 import 'dart:math';
+import 'package:flutter_datetime_picker/src/date_format.dart';
 
 abstract class BasePickerModel {
   String leftStringAtIndex(int index);
@@ -11,6 +12,9 @@ abstract class BasePickerModel {
   int currentMiddleIndex();
   int currentRightIndex();
   DateTime finalTime();
+  String leftDivider();
+  String rightDivider();
+  List<int> layoutProportions();
 }
 
 class CommonPickerModel extends BasePickerModel {
@@ -23,7 +27,7 @@ class CommonPickerModel extends BasePickerModel {
   int _currentRightIndex;
 
   String locale;
-  CommonPickerModel({this.currentTime, locale}) : this.locale = locale ?? 'cn';
+  CommonPickerModel({this.currentTime, locale}) : this.locale = locale ?? 'en';
 
   @override
   String leftStringAtIndex(int index) {
@@ -70,6 +74,21 @@ class CommonPickerModel extends BasePickerModel {
     _currentRightIndex = index;
   }
 
+  @override
+  String leftDivider() {
+    return "";
+  }
+
+  @override
+  String rightDivider() {
+    return "";
+  }
+
+  @override
+  List<int> layoutProportions() {
+    return [1, 1, 1];
+  }
+
   @override
   DateTime finalTime() {}
 }
@@ -146,7 +165,7 @@ class DatePickerModel extends CommonPickerModel {
   }
 
   String _localeYear() {
-    if (locale.matchAsPrefix('cn') == null) {
+    if (locale.matchAsPrefix('zh') == null) {
       return '';
     } else {
       return '年';
@@ -154,7 +173,7 @@ class DatePickerModel extends CommonPickerModel {
   }
 
   String _localeMonth() {
-    if (locale.matchAsPrefix('cn') == null) {
+    if (locale.matchAsPrefix('zh') == null) {
       return '';
     } else {
       return '月';
@@ -162,7 +181,7 @@ class DatePickerModel extends CommonPickerModel {
   }
 
   String _localeDay() {
-    if (locale.matchAsPrefix('cn') == null) {
+    if (locale.matchAsPrefix('zh') == null) {
       return '';
     } else {
       return '日';
@@ -177,3 +196,104 @@ class DatePickerModel extends CommonPickerModel {
     return DateTime(year, month, day);
   }
 }
+
+class TimePickerModel extends CommonPickerModel {
+  TimePickerModel({DateTime currentTime, String locale}) : super(locale: locale) {
+    this.currentTime = currentTime ?? DateTime.now();
+    _currentLeftIndex = this.currentTime.hour;
+    _currentMiddleIndex = this.currentTime.minute;
+    _currentRightIndex = this.currentTime.second;
+  }
+
+  @override
+  String leftStringAtIndex(int index) {
+    if (index >= 0 && index < 24) {
+      return digits(index, 2);
+    } else {
+      return null;
+    }
+  }
+
+  @override
+  String middleStringAtIndex(int index) {
+    if (index >= 0 && index < 60) {
+      return digits(index, 2);
+    } else {
+      return null;
+    }
+  }
+
+  @override
+  String rightStringAtIndex(int index) {
+    if (index >= 0 && index < 60) {
+      return digits(index, 2);
+    } else {
+      return null;
+    }
+  }
+
+  @override
+  String leftDivider() {
+    return ":";
+  }
+
+  @override
+  String rightDivider() {
+    return ":";
+  }
+
+  @override
+  DateTime finalTime() {
+    return DateTime(currentTime.year, currentTime.month, currentTime.day, _currentLeftIndex,
+        _currentMiddleIndex, _currentRightIndex);
+  }
+}
+
+class DateTimePickerModel extends CommonPickerModel {
+  DateTimePickerModel({DateTime currentTime, String locale}) : super(locale: locale) {
+    this.currentTime = currentTime ?? DateTime.now();
+    _currentLeftIndex = 0;
+    _currentMiddleIndex = this.currentTime.hour;
+    _currentRightIndex = this.currentTime.minute;
+  }
+
+  @override
+  String leftStringAtIndex(int index) {
+    DateTime time = currentTime.add(Duration(days: index));
+    return formatDate(time, [ymdw], locale);
+  }
+
+  @override
+  String middleStringAtIndex(int index) {
+    if (index >= 0 && index < 24) {
+      return digits(index, 2);
+    } else {
+      return null;
+    }
+  }
+
+  @override
+  String rightStringAtIndex(int index) {
+    if (index >= 0 && index < 60) {
+      return digits(index, 2);
+    } else {
+      return null;
+    }
+  }
+
+  @override
+  DateTime finalTime() {
+    DateTime time = currentTime.add(Duration(days: _currentLeftIndex));
+    return DateTime(time.year, time.month, time.day, _currentMiddleIndex, _currentRightIndex);
+  }
+
+  @override
+  List<int> layoutProportions() {
+    return [4, 1, 1];
+  }
+
+  @override
+  String rightDivider() {
+    return ':';
+  }
+}

+ 419 - 0
lib/src/date_format.dart

@@ -0,0 +1,419 @@
+/// Outputs year as four digits
+///
+/// Example:
+///     formatDate(new DateTime(2018,8,31), [ymdw]);
+///     // => Today
+const String ymdw = 'ymdw';
+
+///
+/// Example:
+///     formatDate(new DateTime(1989), [yyyy]);
+///     // => 1989
+const String yyyy = 'yyyy';
+
+/// Outputs year as two digits
+///
+/// Example:
+///     formatDate(new DateTime(1989), [yy]);
+///     // => 89
+const String yy = 'yy';
+
+/// Outputs month as two digits
+///
+/// Example:
+///     formatDate(new DateTime(1989, 11), [mm]);
+///     // => 11
+///     formatDate(new DateTime(1989, 5), [mm]);
+///     // => 05
+const String mm = 'mm';
+
+/// Outputs month compactly
+///
+/// Example:
+///     formatDate(new DateTime(1989, 11), [mm]);
+///     // => 11
+///     formatDate(new DateTime(1989, 5), [m]);
+///     // => 5
+const String m = 'm';
+
+/// Outputs month as long name
+///
+/// Example:
+///     formatDate(new DateTime(1989, 2), [MM]);
+///     // => february
+const String MM = 'MM';
+
+/// Outputs month as short name
+///
+/// Example:
+///     formatDate(new DateTime(1989, 2), [M]);
+///     // => feb
+const String M = 'M';
+
+/// Outputs day as two digits
+///
+/// Example:
+///     formatDate(new DateTime(1989, 2, 21), [dd]);
+///     // => 21
+///     formatDate(new DateTime(1989, 2, 5), [dd]);
+///     // => 05
+const String dd = 'dd';
+
+/// Outputs day compactly
+///
+/// Example:
+///     formatDate(new DateTime(1989, 2, 21), [d]);
+///     // => 21
+///     formatDate(new DateTime(1989, 2, 5), [d]);
+///     // => 5
+const String d = 'd';
+
+/// Outputs week in month
+///
+/// Example:
+///     formatDate(new DateTime(1989, 2, 21), [w]);
+///     // => 4
+const String w = 'w';
+
+/// Outputs week in year as two digits
+///
+/// Example:
+///     formatDate(new DateTime(1989, 12, 31), [W]);
+///     // => 53
+///     formatDate(new DateTime(1989, 2, 21), [W]);
+///     // => 08
+const String WW = 'WW';
+
+/// Outputs week in year compactly
+///
+/// Example:
+///     formatDate(new DateTime(1989, 2, 21), [W]);
+///     // => 8
+const String W = 'W';
+
+/// Outputs week day as long name
+///
+/// Example:
+///     formatDate(new DateTime(2018, 1, 14), [DD]);
+///     // => sunday
+const String DD = 'DD';
+
+/// Outputs week day as long name
+///
+/// Example:
+///     formatDate(new DateTime(2018, 1, 14), [D]);
+///     // => sun
+const String D = 'D';
+
+/// Outputs hour (0 - 11) as two digits
+///
+/// Example:
+///     formatDate(new DateTime(1989, 02, 1, 15), [hh]);
+///     // => 03
+const String hh = 'hh';
+
+/// Outputs hour (0 - 11) compactly
+///
+/// Example:
+///     formatDate(new DateTime(1989, 02, 1, 15), [h]);
+///     // => 3
+const String h = 'h';
+
+/// Outputs hour (0 to 23) as two digits
+///
+/// Example:
+///     formatDate(new DateTime(1989, 02, 1, 15), [HH]);
+///     // => 15
+const String HH = 'HH';
+
+/// Outputs hour (0 to 23) compactly
+///
+/// Example:
+///     formatDate(new DateTime(1989, 02, 1, 5), [H]);
+///     // => 5
+const String H = 'H';
+
+/// Outputs minute as two digits
+///
+/// Example:
+///     formatDate(new DateTime(1989, 02, 1, 15, 40), [nn]);
+///     // => 40
+///     formatDate(new DateTime(1989, 02, 1, 15, 4), [nn]);
+///     // => 04
+const String nn = 'nn';
+
+/// Outputs minute compactly
+///
+/// Example:
+///     formatDate(new DateTime(1989, 02, 1, 15, 4), [n]);
+///     // => 4
+const String n = 'n';
+
+/// Outputs second as two digits
+///
+/// Example:
+///     formatDate(new DateTime(1989, 02, 1, 15, 40, 10), [ss]);
+///     // => 10
+///     formatDate(new DateTime(1989, 02, 1, 15, 40, 5), [ss]);
+///     // => 05
+const String ss = 'ss';
+
+/// Outputs second compactly
+///
+/// Example:
+///     formatDate(new DateTime(1989, 02, 1, 15, 40, 5), [s]);
+///     // => 5
+const String s = 's';
+
+/// Outputs millisecond as three digits
+///
+/// Example:
+///     formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 999), [SSS]);
+///     // => 999
+///     formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 99), [SS]);
+///     // => 099
+///     formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0), [SS]);
+///     // => 009
+const String SSS = 'SSS';
+
+/// Outputs millisecond compactly
+///
+/// Example:
+///     formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 999), [SSS]);
+///     // => 999
+///     formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 99), [SS]);
+///     // => 99
+///     formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 9), [SS]);
+///     // => 9
+const String S = 'S';
+
+/// Outputs microsecond as three digits
+///
+/// Example:
+///     formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0, 999), [uuu]);
+///     // => 999
+///     formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0, 99), [uuu]);
+///     // => 099
+///     formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0, 9), [uuu]);
+///     // => 009
+const String uuu = 'uuu';
+
+/// Outputs millisecond compactly
+///
+/// Example:
+///     formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0, 999), [u]);
+///     // => 999
+///     formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0, 99), [u]);
+///     // => 99
+///     formatDate(new DateTime(1989, 02, 1, 15, 40, 10, 0, 9), [u]);
+///     // => 9
+const String u = 'u';
+
+/// Outputs if hour is AM or PM
+///
+/// Example:
+///     print(formatDate(new DateTime(1989, 02, 1, 5), [am]));
+///     // => AM
+///     print(formatDate(new DateTime(1989, 02, 1, 15), [am]));
+///     // => PM
+const String am = 'am';
+
+/// Outputs timezone as time offset
+///
+/// Example:
+///
+const String z = 'z';
+const String Z = 'Z';
+
+String formatDate(DateTime date, List<String> formats, String locale) {
+  if (formats.first == ymdw) {
+    final now = DateTime.now();
+    if (date.year == now.year && date.month == now.month && date.day == now.day) {
+      //today
+      if (locale == 'zh') {
+        return '今天';
+      } else {
+        return 'Today';
+      }
+    } else if (date.year == now.year) {
+      if (locale == 'zh') {
+        return formatDate(date, [mm, '月', dd, '日 ', D], locale);
+      } else {
+        return formatDate(date, [D, ' ', M, ' ', dd], locale);
+      }
+    } else {
+      if (locale == 'zh') {
+        return formatDate(date, [yyyy, '年', mm, '月', dd, '日 ', D], locale);
+      } else {
+        return formatDate(date, [D, ' ', M, ' ', dd, ',', yyyy], locale);
+      }
+    }
+  }
+
+  final sb = new StringBuffer();
+
+  for (String format in formats) {
+    if (format == yyyy) {
+      sb.write(digits(date.year, 4));
+    } else if (format == yy) {
+      sb.write(digits(date.year % 100, 2));
+    } else if (format == mm) {
+      sb.write(digits(date.month, 2));
+    } else if (format == m) {
+      sb.write(date.month);
+    } else if (format == MM) {
+      if (locale == 'zh') {
+        sb.write(monthZH[date.month - 1]);
+      } else {
+        sb.write(monthLong[date.month - 1]);
+      }
+    } else if (format == M) {
+      if (locale == 'zh') {
+        sb.write(monthZH[date.month - 1]);
+      } else {
+        sb.write(monthShort[date.month - 1]);
+      }
+    } else if (format == dd) {
+      sb.write(digits(date.day, 2));
+    } else if (format == d) {
+      sb.write(date.day);
+    } else if (format == w) {
+      sb.write((date.day + 7) ~/ 7);
+    } else if (format == W) {
+      sb.write((dayInYear(date) + 7) ~/ 7);
+    } else if (format == WW) {
+      sb.write(digits((dayInYear(date) + 7) ~/ 7, 2));
+    } else if (format == DD) {
+      if (locale == 'zh') {
+        sb.write(dayZH[date.weekday - 1]);
+      } else {
+        sb.write(dayLong[date.weekday - 1]);
+      }
+    } else if (format == D) {
+      if (locale == 'zh') {
+        sb.write(dayZH[date.weekday - 1]);
+      } else {
+        sb.write(dayShort[date.weekday - 1]);
+      }
+    } else if (format == HH) {
+      sb.write(digits(date.hour, 2));
+    } else if (format == H) {
+      sb.write(date.hour);
+    } else if (format == hh) {
+      sb.write(digits(date.hour % 12, 2));
+    } else if (format == h) {
+      sb.write(date.hour % 12);
+    } else if (format == am) {
+      if (locale == 'zh') {
+        sb.write(date.hour < 12 ? '上午' : '下午');
+      } else {
+        sb.write(date.hour < 12 ? 'AM' : 'PM');
+      }
+    } else if (format == nn) {
+      sb.write(digits(date.minute, 2));
+    } else if (format == n) {
+      sb.write(date.minute);
+    } else if (format == ss) {
+      sb.write(digits(date.second, 2));
+    } else if (format == s) {
+      sb.write(date.second);
+    } else if (format == SSS) {
+      sb.write(digits(date.millisecond, 3));
+    } else if (format == S) {
+      sb.write(date.second);
+    } else if (format == uuu) {
+      sb.write(digits(date.microsecond, 2));
+    } else if (format == u) {
+      sb.write(date.microsecond);
+    } else if (format == z) {
+      if (date.timeZoneOffset.inMinutes == 0) {
+        sb.write('Z');
+      } else {
+        if (date.timeZoneOffset.isNegative) {
+          sb.write('-');
+          sb.write(digits((-date.timeZoneOffset.inHours) % 24, 2));
+          sb.write(digits((-date.timeZoneOffset.inMinutes) % 60, 2));
+        } else {
+          sb.write('+');
+          sb.write(digits(date.timeZoneOffset.inHours % 24, 2));
+          sb.write(digits(date.timeZoneOffset.inMinutes % 60, 2));
+        }
+      }
+    } else if (format == Z) {
+      sb.write(date.timeZoneName);
+    } else {
+      sb.write(format);
+    }
+  }
+
+  return sb.toString();
+}
+
+String digits(int value, int length) {
+  String ret = '$value';
+  if (ret.length < length) {
+    ret = '0' * (length - ret.length) + ret;
+  }
+  return ret;
+}
+
+const List<String> monthShort = const <String>[
+  'Jan',
+  'Feb',
+  'Mar',
+  'Apr',
+  'May',
+  'Jun',
+  'Jul',
+  'Aug',
+  'Sep',
+  'Oct',
+  'Nov',
+  'Dec'
+];
+
+const List<String> monthLong = const <String>[
+  'January',
+  'February',
+  'March',
+  'April',
+  'May',
+  'June',
+  'July',
+  'August',
+  'September',
+  'October',
+  'November',
+  'December'
+];
+
+const List<String> monthZH = const <String>[
+  '一月',
+  '二月',
+  '三月',
+  '四月',
+  '五月',
+  '六月',
+  '七月',
+  '八月',
+  '九月',
+  '十月',
+  '十一月',
+  '十二月'
+];
+
+const List<String> dayZH = const ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'];
+
+const List<String> dayShort = const ['Mon', 'Tue', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun'];
+
+const List<String> dayLong = const [
+  'Monday',
+  'Tuesday',
+  'Wednesday',
+  'Thursday',
+  'Friday',
+  'Saturday',
+  'Sunday'
+];
+
+int dayInYear(DateTime date) => date.difference(new DateTime(date.year, 1, 1)).inDays;

+ 2 - 2
pubspec.yaml

@@ -1,11 +1,11 @@
 name: flutter_datetime_picker
 description: A date time picker for flutter
-version: 0.1.0
+version: 0.1.1
 author: Realank <realank@126.com>
 homepage: https://github.com/Realank
 
 environment:
-  sdk: ">=2.0.0-dev.68.0 <3.0.0"
+  sdk: ">=1.19.0 <3.0.0"
 
 dependencies:
   flutter:

BIN
screenshot/date.png


BIN
screenshot/datetime_chinese.png


BIN
screenshot/datetime_english.png


BIN
screenshot/time.png