showDraftModeAndroidTimeDialog function
Future<DateTime?>
showDraftModeAndroidTimeDialog({
- required BuildContext context,
- required DateTime value,
- required DraftModeUIDateTimeMinuteInterval minuteInterval,
- String? label,
Implementation
Future<DateTime?> showDraftModeAndroidTimeDialog({
required BuildContext context,
required DateTime value,
required DraftModeUIDateTimeMinuteInterval minuteInterval,
String? label,
}) {
final materialLocalizations = MaterialLocalizations.of(context);
final mediaQuery = MediaQuery.maybeOf(context);
final hours = List<int>.generate(24, (index) => index);
final minuteOptions = List<int>.generate(
60 ~/ minuteInterval.minutes,
(index) => index * minuteInterval.minutes,
);
int selectedHour = value.hour;
int selectedMinute = value.minute;
return showDialog<DateTime>(
context: context,
barrierDismissible: true,
builder: (dialogContext) {
return StatefulBuilder(
builder: (context, setState) {
final preview = materialLocalizations.formatTimeOfDay(
TimeOfDay(hour: selectedHour, minute: selectedMinute),
alwaysUse24HourFormat: mediaQuery?.alwaysUse24HourFormat ?? false,
);
return AlertDialog(
title: Text(label ?? materialLocalizations.timePickerDialHelpText),
content: SizedBox(
width: 320,
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
preview,
style: Theme.of(context).textTheme.headlineSmall,
),
const SizedBox(height: 16),
Row(
children: [
Expanded(
child: DropdownButtonFormField<int>(
key: const ValueKey('draftmode-time-hour-field'),
initialValue: selectedHour,
decoration: const InputDecoration(
labelText: 'Hour',
),
items: hours
.map(
(hour) => DropdownMenuItem<int>(
value: hour,
child: Text(hour.toString().padLeft(2, '0')),
),
)
.toList(),
onChanged: (nextHour) {
if (nextHour == null) {
return;
}
setState(() {
selectedHour = nextHour;
});
},
),
),
const SizedBox(width: 12),
Expanded(
child: DropdownButtonFormField<int>(
key: const ValueKey('draftmode-time-minute-field'),
initialValue: selectedMinute,
decoration: const InputDecoration(
labelText: 'Minute',
),
items: minuteOptions
.map(
(minute) => DropdownMenuItem<int>(
value: minute,
child:
Text(minute.toString().padLeft(2, '0')),
),
)
.toList(),
onChanged: (nextMinute) {
if (nextMinute == null) {
return;
}
setState(() {
selectedMinute = nextMinute;
});
},
),
),
],
),
],
),
),
actions: [
TextButton(
onPressed: () => Navigator.of(dialogContext).pop(),
child: Text(materialLocalizations.cancelButtonLabel),
),
FilledButton(
onPressed: () => Navigator.of(dialogContext).pop(
DateTime(
value.year,
value.month,
value.day,
selectedHour,
selectedMinute,
),
),
child: Text(materialLocalizations.okButtonLabel),
),
],
);
},
);
},
);
}