showDraftModeAndroidTimeDialog function

Future<DateTime?> showDraftModeAndroidTimeDialog({
  1. required BuildContext context,
  2. required DateTime value,
  3. required DraftModeUIDateTimeMinuteInterval minuteInterval,
  4. 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),
              ),
            ],
          );
        },
      );
    },
  );
}