@@ -375,6 +375,7 @@ class DateTimePicker extends FormField<String> {
375375 ///
376376 /// If null, this widget will create its own [TextEditingController] and
377377 /// initialize its [TextEditingController.text] with [initialValue] .
378+ /// The value need to be a DateTime String or null
378379 final TextEditingController controller;
379380
380381 /// The earliest allowable [DateTime] that the user can select.
@@ -519,7 +520,7 @@ class _DateTimePickerState extends FormFieldState<String> {
519520 TimeOfDay _tTime = TimeOfDay .now ();
520521 String _sValue;
521522 String _sDate = '' ;
522- String _sTime = '00:00 ' ;
523+ String _sTime = '' ;
523524
524525 @override
525526 DateTimePicker get widget => super .widget as DateTimePicker ;
@@ -537,7 +538,7 @@ class _DateTimePickerState extends FormFieldState<String> {
537538 widget.controller.addListener (_handleControllerChanged);
538539 }
539540
540- String lsValue = _effectiveController.text;
541+ String lsValue = _effectiveController.text. trim () ;
541542
542543 if (lsValue != null && lsValue != '' && lsValue != 'null' ) {
543544 if (widget.type != DateTimePickerType .time) {
@@ -554,9 +555,12 @@ class _DateTimePickerState extends FormFieldState<String> {
554555 _dateLabelController.text =
555556 DateFormat (widget.dateMask).format (_dDate);
556557 } else {
557- String lsMask = widget.type == DateTimePickerType .dateTime
558- ? 'MMM d, yyyy - HH:mm'
559- : 'MMM d, yyyy' ;
558+ String lsMask = 'MMM d, yyyy' ;
559+
560+ if (widget.type == DateTimePickerType .dateTime && _sTime != '' ) {
561+ lsMask = 'MMM d, yyyy - HH:mm' ;
562+ }
563+
560564 _dateLabelController.text = DateFormat (lsMask).format (_dDate);
561565 }
562566 } else {
@@ -592,27 +596,39 @@ class _DateTimePickerState extends FormFieldState<String> {
592596 }
593597
594598 if (_effectiveController.text != null && _effectiveController.text != '' ) {
595- String lsValue = _effectiveController.text;
599+ String lsValue = _effectiveController.text. trim () ;
596600
597601 if (lsValue != null && lsValue != '' && lsValue != 'null' ) {
598602 if (widget.type != DateTimePickerType .time) {
603+ String lsOldDate = _sDate;
604+ String lsOldTime = _sTime;
599605 _dDate = DateTime .tryParse (lsValue);
600- _tTime = TimeOfDay .fromDateTime (_dDate);
601606
602- _sDate = DateFormat ( 'yyyy-MM-dd' ). format (_dDate);
603- _sTime = DateFormat ('HH:mm ' ).format (_dDate);
607+ if (_dDate != null ) {
608+ _sDate = DateFormat ('yyyy-MM-dd ' ).format (_dDate);
604609
605- _timeLabelController.text = _sTime;
606- _dateLabelController.text = _sDate;
607-
608- if (widget.dateMask != null && widget.dateMask != '' ) {
609- _dateLabelController.text =
610- DateFormat (widget.dateMask).format (_dDate);
611- } else {
612- String lsMask = widget.type == DateTimePickerType .dateTime
613- ? 'MMM d, yyyy - HH:mm'
614- : 'MMM d, yyyy' ;
615- _dateLabelController.text = DateFormat (lsMask).format (_dDate);
610+ if (lsOldTime != '' ) {
611+ _tTime = TimeOfDay .fromDateTime (_dDate);
612+ _sTime = DateFormat ('HH:mm' ).format (_dDate);
613+ }
614+ }
615+
616+ _dateLabelController.text = lsOldDate != '' ? _sDate : '' ;
617+ _timeLabelController.text = lsOldTime != '' ? _sTime : '' ;
618+
619+ if (_dDate != null ) {
620+ if (widget.dateMask != null && widget.dateMask != '' ) {
621+ _dateLabelController.text =
622+ DateFormat (widget.dateMask).format (_dDate);
623+ } else {
624+ String lsMask = 'MMM d, yyyy' ;
625+
626+ if (widget.type == DateTimePickerType .dateTime && _sTime != '' ) {
627+ lsMask = 'MMM d, yyyy - HH:mm' ;
628+ }
629+
630+ _dateLabelController.text = DateFormat (lsMask).format (_dDate);
631+ }
616632 }
617633 } else {
618634 List <String > llTime = lsValue.split (':' );
@@ -658,7 +674,7 @@ class _DateTimePickerState extends FormFieldState<String> {
658674 Future <void > _showDatePickerDialog () async {
659675 DateTime ldDatePicked = await showDatePicker (
660676 context: context,
661- initialDate: _dDate,
677+ initialDate: _dDate ?? DateTime . now () ,
662678 firstDate: widget.firstDate,
663679 lastDate: widget.lastDate,
664680 helpText: widget.calendarTitle,
@@ -677,9 +693,10 @@ class _DateTimePickerState extends FormFieldState<String> {
677693 routeSettings: widget.routeSettings,
678694 );
679695
680- if (ldDatePicked != null && ldDatePicked != _dDate ) {
696+ if (ldDatePicked != null ) {
681697 _sDate = DateFormat ('yyyy-MM-dd' ).format (ldDatePicked);
682698 _dDate = ldDatePicked;
699+ String lsOldValue = _sValue;
683700 _sValue = _sDate;
684701 String lsFormatedDate;
685702
@@ -691,21 +708,24 @@ class _DateTimePickerState extends FormFieldState<String> {
691708 DateFormat ('MMM dd, yyyy' ).format (DateTime .tryParse (_sDate));
692709 }
693710
694- if (widget.type == DateTimePickerType .dateTimeSeparate) {
711+ if (widget.type == DateTimePickerType .dateTimeSeparate && _sTime != '' ) {
695712 _sValue = '$_sDate $_sTime ' ;
696713 }
697714
715+ _sValue = _sValue.trim ();
698716 _dateLabelController.text = lsFormatedDate;
699717 _effectiveController.text = _sValue;
700718
701- onChangedHandler (_sValue);
719+ if (_sValue != lsOldValue) {
720+ onChangedHandler (_sValue);
721+ }
702722 }
703723 }
704724
705725 Future <void > _showTimePickerDialog () async {
706726 TimeOfDay ltTimePicked = await showTimePicker (
707727 context: context,
708- initialTime: _tTime,
728+ initialTime: _tTime ?? TimeOfDay . now () ,
709729 useRootNavigator: widget.useRootNavigator ?? false ,
710730 routeSettings: widget.routeSettings,
711731 builder: (BuildContext context, Widget child) {
@@ -717,22 +737,26 @@ class _DateTimePickerState extends FormFieldState<String> {
717737 },
718738 );
719739
720- if (ltTimePicked != null && ltTimePicked != _tTime ) {
740+ if (ltTimePicked != null ) {
721741 String lsHour = ltTimePicked.hour.toString ().padLeft (2 , '0' );
722742 String lsMinute = ltTimePicked.minute.toString ().padLeft (2 , '0' );
723743 _sTime = '$lsHour :$lsMinute ' ;
724744 _tTime = ltTimePicked;
725745
726746 _timeLabelController.text = _sTime;
747+ String lsOldValue = _sValue;
727748 _sValue = _sTime;
728749
729- if (widget.type == DateTimePickerType .dateTimeSeparate) {
750+ if (widget.type == DateTimePickerType .dateTimeSeparate && _sDate != '' ) {
730751 _sValue = '$_sDate $_sTime ' ;
731752 }
732753
754+ _sValue = _sValue.trim ();
733755 _effectiveController.text = _sValue;
734756
735- onChangedHandler (_sValue);
757+ if (_sValue != lsOldValue) {
758+ onChangedHandler (_sValue);
759+ }
736760 }
737761 }
738762
@@ -741,7 +765,7 @@ class _DateTimePickerState extends FormFieldState<String> {
741765
742766 DateTime ldDatePicked = await showDatePicker (
743767 context: context,
744- initialDate: _dDate,
768+ initialDate: _dDate ?? DateTime . now () ,
745769 firstDate: widget.firstDate,
746770 lastDate: widget.lastDate,
747771 helpText: widget.calendarTitle,
@@ -760,13 +784,13 @@ class _DateTimePickerState extends FormFieldState<String> {
760784 routeSettings: widget.routeSettings,
761785 );
762786
763- if (ldDatePicked != null && ldDatePicked != _dDate ) {
787+ if (ldDatePicked != null ) {
764788 _sDate = DateFormat ('yyyy-MM-dd' ).format (ldDatePicked);
765789 _dDate = ldDatePicked;
766790
767791 TimeOfDay ltTimePicked = await showTimePicker (
768792 context: context,
769- initialTime: _tTime,
793+ initialTime: _tTime ?? TimeOfDay . now () ,
770794 useRootNavigator: widget.useRootNavigator ?? false ,
771795 routeSettings: widget.routeSettings,
772796 builder: (BuildContext context, Widget child) {
@@ -777,27 +801,31 @@ class _DateTimePickerState extends FormFieldState<String> {
777801 },
778802 );
779803
780- if (ltTimePicked != null && ltTimePicked != _tTime ) {
804+ if (ltTimePicked != null ) {
781805 String lsHour = ltTimePicked.hour.toString ().padLeft (2 , '0' );
782806 String lsMinute = ltTimePicked.minute.toString ().padLeft (2 , '0' );
783807 _sTime = '$lsHour :$lsMinute ' ;
784808 _tTime = ltTimePicked;
785809 }
786810
811+ String lsOldValue = _sValue;
787812 _sValue = '$_sDate $_sTime ' ;
813+ _sValue = _sValue.trim ();
788814
789815 if (widget.dateMask != null && widget.dateMask != '' ) {
790816 lsFormatedDate =
791817 DateFormat (widget.dateMask).format (DateTime .tryParse (_sValue));
792818 } else {
793- lsFormatedDate = DateFormat ( ' MMM dd, yyyy - HH:mm')
794- .format (DateTime .tryParse (_sValue));
819+ String lsMask = _sTime != '' ? ' MMM dd, yyyy - HH:mm' : 'MMM dd, yyyy' ;
820+ lsFormatedDate = DateFormat (lsMask) .format (DateTime .tryParse (_sValue));
795821 }
796822
797823 _dateLabelController.text = lsFormatedDate;
798824 _effectiveController.text = _sValue;
799825
800- onChangedHandler (_sValue);
826+ if (_sValue != lsOldValue) {
827+ onChangedHandler (_sValue);
828+ }
801829 }
802830 }
803831}
0 commit comments