Skip to content

Commit ca8575a

Browse files
committed
Included option to use cupertino style picker for FormBuilderDateTimePicker. Closes #176
1 parent 85ee48b commit ca8575a

File tree

5 files changed

+67
-19
lines changed

5 files changed

+67
-19
lines changed

example/lib/sources/complete_form.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,14 +142,12 @@ class CompleteFormState extends State<CompleteForm> {
142142
),
143143
FormBuilderDateTimePicker(
144144
attribute: 'date',
145-
// onChanged: _onChanged,
146145
inputType: InputType.time,
147146
decoration: InputDecoration(
148147
labelText: 'Appointment Time',
149148
),
150149
initialTime: TimeOfDay(hour: 8, minute: 0),
151-
// initialValue: DateTime.now(),
152-
// readonly: true,
150+
pickerType: PickerType.cupertino,
153151
),
154152
FormBuilderDateRangePicker(
155153
attribute: 'date_range',

lib/src/fields/form_builder_date_time_picker.dart

Lines changed: 52 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@ import 'dart:ui' as ui;
44
import 'package:datetime_picker_formfield/datetime_picker_formfield.dart';
55
import 'package:flutter/material.dart';
66
import 'package:flutter/services.dart';
7+
import 'package:flutter_datetime_picker/flutter_datetime_picker.dart';
78
import 'package:flutter_form_builder/flutter_form_builder.dart';
9+
import 'package:flutter_form_builder/src/utils.dart';
810
import 'package:intl/intl.dart';
911

1012
enum InputType { date, time, both }
13+
enum PickerType { material, cupertino }
1114

1215
class FormBuilderDateTimePicker extends FormBuilderField {
1316
/// The date/time picker dialogs to show.
@@ -133,6 +136,8 @@ class FormBuilderDateTimePicker extends FormBuilderField {
133136
final DatePickerEntryMode initialEntryMode;
134137
final RouteSettings routeSettings;
135138

139+
final PickerType pickerType;
140+
136141
FormBuilderDateTimePicker({
137142
Key key,
138143
//From Super
@@ -149,6 +154,7 @@ class FormBuilderDateTimePicker extends FormBuilderField {
149154
VoidCallback onReset,
150155
FocusNode focusNode,
151156
this.inputType = InputType.both,
157+
this.pickerType = PickerType.material,
152158
this.scrollPadding = const EdgeInsets.all(20.0),
153159
this.cursorWidth = 2.0,
154160
this.enableInteractiveSelection = true,
@@ -216,22 +222,11 @@ class FormBuilderDateTimePicker extends FormBuilderField {
216222
decoration: decoration,
217223
builder: (FormFieldState field) {
218224
final _FormBuilderDateTimePickerState state = field;
225+
219226
return DateTimeField(
220227
key: state.fieldKey,
221228
initialValue: state.initialValue,
222229
format: state.dateFormat,
223-
/*onSaved: (val) {
224-
var value = _fieldKey.currentState.value;
225-
var transformed;
226-
if (valueTransformer != null) {
227-
transformed = valueTransformer(val);
228-
_formState?.setAttributeValue(attribute, transformed);
229-
} else
230-
_formState?.setAttributeValue(attribute, value);
231-
if (onSaved != null) {
232-
onSaved(transformed ?? value);
233-
}
234-
},*/
235230
validator: validator,
236231
onShowPicker: state.onShowPicker,
237232
autovalidate: autovalidate,
@@ -294,8 +289,8 @@ class _FormBuilderDateTimePickerState extends FormBuilderFieldState {
294289
TextEditingController _textFieldController;
295290
DateTime stateCurrentValue;
296291

297-
DateFormat get dateFormat => _dateFormat;
298-
DateFormat _dateFormat;
292+
DateFormat get dateFormat =>
293+
widget.format ?? _dateTimeFormats[widget.inputType];
299294

300295
final _dateTimeFormats = {
301296
InputType.both: DateFormat.yMd().add_jm(),
@@ -309,9 +304,8 @@ class _FormBuilderDateTimePickerState extends FormBuilderFieldState {
309304
stateCurrentValue = _initialValue;
310305
_focusNode = widget.focusNode ?? FocusNode();
311306
_textFieldController = widget.controller ?? TextEditingController();
312-
_dateFormat = widget.format ?? _dateTimeFormats[widget.inputType];
313307
_textFieldController.text =
314-
_initialValue == null ? '' : _dateFormat.format(_initialValue);
308+
_initialValue == null ? '' : dateFormat.format(_initialValue);
315309
_focusNode.addListener(_handleFocus);
316310
}
317311

@@ -359,6 +353,18 @@ class _FormBuilderDateTimePickerState extends FormBuilderFieldState {
359353
if (widget.datePicker != null) {
360354
return widget.datePicker(context);
361355
} else {
356+
if (widget.pickerType == PickerType.cupertino) {
357+
return DatePicker.showDatePicker(
358+
context,
359+
showTitleActions: true,
360+
minTime: widget.firstDate,
361+
maxTime: widget.lastDate,
362+
currentTime: currentValue,
363+
locale: enumValueFromString(
364+
(widget.locale ?? Localizations.localeOf(context))?.languageCode,
365+
LocaleType.values),
366+
);
367+
}
362368
return showDatePicker(
363369
context: context,
364370
selectableDayPredicate: widget.selectableDayPredicate,
@@ -396,6 +402,36 @@ class _FormBuilderDateTimePickerState extends FormBuilderFieldState {
396402
if (widget.timePicker != null) {
397403
return widget.timePicker(context);
398404
} else {
405+
if (widget.pickerType == PickerType.cupertino) {
406+
if (widget.alwaysUse24HourFormat) {
407+
return DatePicker.showTimePicker(
408+
context,
409+
showTitleActions: true,
410+
currentTime: currentValue,
411+
showSecondsColumn: false,
412+
locale: enumValueFromString(
413+
(widget.locale ?? Localizations.localeOf(context))
414+
?.languageCode,
415+
LocaleType.values),
416+
).then(
417+
(result) {
418+
return TimeOfDay.fromDateTime(result ?? currentValue);
419+
},
420+
);
421+
}
422+
return DatePicker.showTime12hPicker(
423+
context,
424+
showTitleActions: true,
425+
currentTime: currentValue,
426+
locale: enumValueFromString(
427+
(widget.locale ?? Localizations.localeOf(context))?.languageCode,
428+
LocaleType.values),
429+
).then(
430+
(result) {
431+
return TimeOfDay.fromDateTime(result ?? currentValue);
432+
},
433+
);
434+
}
399435
return showTimePicker(
400436
context: context,
401437
initialTime: currentValue != null

lib/src/utils.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
String enumValueToString(Object o) => o.toString().split('.').last;
2+
3+
T enumValueFromString<T>(String key, Iterable<T> values) => values.firstWhere(
4+
(v) => v != null && key == enumValueToString(v),
5+
orElse: () => null,
6+
);

pubspec.lock

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,13 @@ packages:
153153
url: "https://pub.dartlang.org"
154154
source: hosted
155155
version: "0.3.4"
156+
flutter_datetime_picker:
157+
dependency: "direct main"
158+
description:
159+
name: flutter_datetime_picker
160+
url: "https://pub.dartlang.org"
161+
source: hosted
162+
version: "1.3.8"
156163
flutter_keyboard_visibility:
157164
dependency: transitive
158165
description:

pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ dependencies:
2626
rating_bar: ^0.2.0
2727
signature: ^3.2.0
2828
validators: ^2.0.1
29+
flutter_datetime_picker: ^1.3.8
2930

3031
dev_dependencies:
3132
flutter_test:

0 commit comments

Comments
 (0)