Skip to content

Commit ffed0d5

Browse files
authored
DateRangePicker keyboardType (#122353)
DateRangePicker now has a keyboardType parameter, same as DatePicker.
1 parent 313b016 commit ffed0d5

File tree

2 files changed

+69
-2
lines changed

2 files changed

+69
-2
lines changed

packages/flutter/lib/src/material/date_picker.dart

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -340,9 +340,11 @@ class DatePickerDialog extends StatefulWidget {
340340
/// string. For example, 'Month, Day, Year' for en_US.
341341
final String? fieldLabelText;
342342

343+
/// {@template flutter.material.datePickerDialog}
343344
/// The keyboard type of the [TextField].
344345
///
345346
/// If this is null, it will default to [TextInputType.datetime]
347+
/// {@endtemplate}
346348
final TextInputType? keyboardType;
347349

348350
/// Restoration ID to save and restore the state of the [DatePickerDialog].
@@ -991,6 +993,7 @@ Future<DateTimeRange?> showDateRangePicker({
991993
TextDirection? textDirection,
992994
TransitionBuilder? builder,
993995
Offset? anchorPoint,
996+
TextInputType keyboardType = TextInputType.datetime,
994997
}) async {
995998
assert(
996999
initialDateRange == null || !initialDateRange.start.isAfter(initialDateRange.end),
@@ -1039,6 +1042,7 @@ Future<DateTimeRange?> showDateRangePicker({
10391042
fieldEndHintText: fieldEndHintText,
10401043
fieldStartLabelText: fieldStartLabelText,
10411044
fieldEndLabelText: fieldEndLabelText,
1045+
keyboardType: keyboardType,
10421046
);
10431047

10441048
if (textDirection != null) {
@@ -1125,6 +1129,7 @@ class DateRangePickerDialog extends StatefulWidget {
11251129
this.fieldEndHintText,
11261130
this.fieldStartLabelText,
11271131
this.fieldEndLabelText,
1132+
this.keyboardType = TextInputType.datetime,
11281133
this.restorationId,
11291134
});
11301135

@@ -1231,6 +1236,9 @@ class DateRangePickerDialog extends StatefulWidget {
12311236
/// is used.
12321237
final String? fieldEndLabelText;
12331238

1239+
/// {@macro flutter.material.datePickerDialog}
1240+
final TextInputType keyboardType;
1241+
12341242
/// Restoration ID to save and restore the state of the [DateRangePickerDialog].
12351243
///
12361244
/// If it is non-null, the date range picker will persist and restore the
@@ -1427,6 +1435,7 @@ class _DateRangePickerDialogState extends State<DateRangePickerDialog> with Rest
14271435
fieldEndHintText: widget.fieldEndHintText,
14281436
fieldStartLabelText: widget.fieldStartLabelText,
14291437
fieldEndLabelText: widget.fieldEndLabelText,
1438+
keyboardType: widget.keyboardType,
14301439
),
14311440
const Spacer(),
14321441
],
@@ -2773,6 +2782,7 @@ class _InputDateRangePicker extends StatefulWidget {
27732782
this.fieldEndLabelText,
27742783
this.autofocus = false,
27752784
this.autovalidate = false,
2785+
this.keyboardType = TextInputType.datetime,
27762786
}) : initialStartDate = initialStartDate == null ? null : DateUtils.dateOnly(initialStartDate),
27772787
initialEndDate = initialEndDate == null ? null : DateUtils.dateOnly(initialEndDate),
27782788
firstDate = DateUtils.dateOnly(firstDate),
@@ -2832,6 +2842,9 @@ class _InputDateRangePicker extends StatefulWidget {
28322842
/// [_InputDateRangePickerState.validate] to validate.
28332843
final bool autovalidate;
28342844

2845+
/// {@macro flutter.material.datePickerDialog}
2846+
final TextInputType keyboardType;
2847+
28352848
@override
28362849
_InputDateRangePickerState createState() => _InputDateRangePickerState();
28372850
}
@@ -2972,7 +2985,7 @@ class _InputDateRangePickerState extends State<_InputDateRangePicker> {
29722985
labelText: widget.fieldStartLabelText ?? localizations.dateRangeStartLabel,
29732986
errorText: _startErrorText,
29742987
),
2975-
keyboardType: TextInputType.datetime,
2988+
keyboardType: widget.keyboardType,
29762989
onChanged: _handleStartChanged,
29772990
autofocus: widget.autofocus,
29782991
),
@@ -2988,7 +3001,7 @@ class _InputDateRangePickerState extends State<_InputDateRangePicker> {
29883001
labelText: widget.fieldEndLabelText ?? localizations.dateRangeEndLabel,
29893002
errorText: _endErrorText,
29903003
),
2991-
keyboardType: TextInputType.datetime,
3004+
keyboardType: widget.keyboardType,
29923005
onChanged: _handleEndChanged,
29933006
),
29943007
),

packages/flutter/test/material/date_range_picker_test.dart

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,6 +1103,60 @@ void main() {
11031103
semantics.dispose();
11041104
});
11051105
});
1106+
1107+
for (final TextInputType? keyboardType in <TextInputType?>[null, TextInputType.emailAddress]) {
1108+
testWidgets('DateRangePicker takes keyboardType $keyboardType', (WidgetTester tester) async {
1109+
late BuildContext buttonContext;
1110+
const InputBorder border = InputBorder.none;
1111+
await tester.pumpWidget(MaterialApp(
1112+
theme: ThemeData.light().copyWith(
1113+
inputDecorationTheme: const InputDecorationTheme(
1114+
border: border,
1115+
),
1116+
),
1117+
home: Material(
1118+
child: Builder(
1119+
builder: (BuildContext context) {
1120+
return ElevatedButton(
1121+
onPressed: () {
1122+
buttonContext = context;
1123+
},
1124+
child: const Text('Go'),
1125+
);
1126+
},
1127+
),
1128+
),
1129+
));
1130+
1131+
await tester.tap(find.text('Go'));
1132+
expect(buttonContext, isNotNull);
1133+
1134+
if (keyboardType == null) {
1135+
// If no keyboardType, expect the default.
1136+
showDateRangePicker(
1137+
context: buttonContext,
1138+
initialDateRange: initialDateRange,
1139+
firstDate: firstDate,
1140+
lastDate: lastDate,
1141+
initialEntryMode: DatePickerEntryMode.input,
1142+
);
1143+
} else {
1144+
// If there is a keyboardType, expect it to be passed through.
1145+
showDateRangePicker(
1146+
context: buttonContext,
1147+
initialDateRange: initialDateRange,
1148+
firstDate: firstDate,
1149+
lastDate: lastDate,
1150+
initialEntryMode: DatePickerEntryMode.input,
1151+
keyboardType: keyboardType,
1152+
);
1153+
}
1154+
await tester.pumpAndSettle();
1155+
1156+
final DateRangePickerDialog picker = tester.widget(find.byType(DateRangePickerDialog));
1157+
expect(picker.keyboardType, keyboardType ?? TextInputType.datetime);
1158+
});
1159+
}
11061160
}
11071161

11081162
class _RestorableDateRangePickerDialogTestWidget extends StatefulWidget {

0 commit comments

Comments
 (0)