showPlatformDatePicker function

Future<Date?> showPlatformDatePicker({
  1. required BuildContext context,
  2. required Date firstDate,
  3. required Date lastDate,
  4. Date? initialDate,
  5. Offset? anchorPoint,
  6. Color? barrierColor,
  7. bool? barrierDismissible,
  8. RouteSettings? routeSettings,
  9. bool useRootNavigator = kDefaultUseRootNavigator,
  10. SelectableDayPredicate? selectableDayPredicate,
  11. TransitionBuilder? builder,
  12. MaterialDatePickerData? materialDatePickerData,
  13. CupertinoDatePickerData? cupertinoDatePickerData,
})

Shows a platform-adaptive date picker that renders Material showDatePicker on Android and CupertinoDatePicker on iOS.

This function automatically selects the appropriate date picker implementation based on the target platform:

  • On Android: shows a Material Design date picker
  • On iOS: shows a Cupertino date picker

The date picker can be configured with platform-specific data through materialDatePickerData and cupertinoDatePickerData, or with common properties.

Example:

final selectedDate = await showPlatformDatePicker(
  context: context,
  firstDate: Date(2023, 1, 1),
  lastDate: Date(2023, 12, 31),
  initialDate: Date.now(),
);

Implementation

Future<Date?> showPlatformDatePicker({
  /// The build context for showing the date picker.
  required BuildContext context,

  /// The earliest selectable date.
  required Date firstDate,

  /// The latest selectable date.
  required Date lastDate,

  /// The initially selected date.
  Date? initialDate,

  /// The anchor point for positioning the date picker.
  Offset? anchorPoint,

  /// Color of the modal barrier behind the date picker.
  Color? barrierColor,

  /// Whether tapping the barrier dismisses the date picker.
  bool? barrierDismissible,

  /// Route settings for the date picker route.
  RouteSettings? routeSettings,

  /// Whether to use the root navigator for the date picker route.
  bool useRootNavigator = kDefaultUseRootNavigator,

  /// Predicate for determining which days are selectable.
  SelectableDayPredicate? selectableDayPredicate,

  /// Builder for customizing the date picker appearance.
  TransitionBuilder? builder,

  /// Material-specific date picker data.
  MaterialDatePickerData? materialDatePickerData,

  /// Cupertino-specific date picker data.
  CupertinoDatePickerData? cupertinoDatePickerData,
}) {
  final initialDateTime = initialDate?.toDateTime();
  final firstDateTime = firstDate.toDateTime();
  final lastDateTime = lastDate.toDateTime();

  return context.platformLazyValue(
    material: () => showDatePicker(
      context: context,
      initialDate: initialDateTime,
      firstDate: firstDateTime,
      lastDate: lastDateTime,
      anchorPoint: materialDatePickerData?.anchorPoint ?? anchorPoint,
      barrierColor: materialDatePickerData?.barrierColor ?? barrierColor,
      barrierDismissible:
          materialDatePickerData?.barrierDismissible ??
          barrierDismissible ??
          kMaterialBarrierDismissible,
      routeSettings: materialDatePickerData?.routeSettings ?? routeSettings,
      useRootNavigator: materialDatePickerData?.useRootNavigator ?? useRootNavigator,
      selectableDayPredicate:
          materialDatePickerData?.selectableDayPredicate ?? selectableDayPredicate,
      builder: materialDatePickerData?.builder ?? builder,
      currentDate: materialDatePickerData?.currentDate,
      initialEntryMode:
          materialDatePickerData?.initialEntryMode ??
          MaterialDatePickerData.kDefaultInitialEntryMode,
      helpText: materialDatePickerData?.helpText,
      cancelText: materialDatePickerData?.cancelText,
      confirmText: materialDatePickerData?.confirmText,
      locale: materialDatePickerData?.locale,
      barrierLabel: materialDatePickerData?.barrierLabel,
      textDirection: materialDatePickerData?.textDirection,
      initialDatePickerMode:
          materialDatePickerData?.initialDatePickerMode ??
          MaterialDatePickerData.kDefaultInitialDatePickerMode,
      errorFormatText: materialDatePickerData?.errorFormatText,
      errorInvalidText: materialDatePickerData?.errorInvalidText,
      fieldHintText: materialDatePickerData?.fieldHintText,
      fieldLabelText: materialDatePickerData?.fieldLabelText,
      keyboardType: materialDatePickerData?.keyboardType,
      onDatePickerModeChange: materialDatePickerData?.onDatePickerModeChange,
      switchToInputEntryModeIcon: materialDatePickerData?.switchToInputEntryModeIcon,
      switchToCalendarEntryModeIcon: materialDatePickerData?.switchToCalendarEntryModeIcon,
      calendarDelegate:
          materialDatePickerData?.calendarDelegate ??
          MaterialDatePickerData.kDefaultCalendarDelegate,
    ).then((dateTime) => dateTime?.toDate()),
    cupertino: () async {
      var selectedDateTime = initialDateTime ?? DateTime.now();
      final resolvedBuilder = cupertinoDatePickerData?.builder ?? builder;

      final pickerWidget = CupertinoDatePicker(
        initialDateTime: initialDateTime,
        minimumDate: firstDateTime,
        maximumDate: lastDateTime,
        selectableDayPredicate: cupertinoDatePickerData?.selectableDayPredicate,
        mode: .date,
        onDateTimeChanged: (dateTime) => selectedDateTime = dateTime,
        backgroundColor: cupertinoDatePickerData?.backgroundColor,
        changeReportingBehavior:
            cupertinoDatePickerData?.changeReportingBehavior ??
            ChangeReportingBehavior.onScrollUpdate,
        dateOrder: cupertinoDatePickerData?.dateOrder,
        itemExtent:
            cupertinoDatePickerData?.itemExtent ?? CupertinoDatePickerData.kDefaultItemExtent,
        maximumYear: cupertinoDatePickerData?.maximumYear,
        minimumYear:
            cupertinoDatePickerData?.minimumYear ?? CupertinoDatePickerData.kDefaultMinimumYear,
        minuteInterval:
            cupertinoDatePickerData?.minuteInterval ??
            CupertinoDatePickerData.kDefaultMinuteInterval,
        selectionOverlayBuilder: cupertinoDatePickerData?.selectionOverlayBuilder,
        showDayOfWeek:
            cupertinoDatePickerData?.showDayOfWeek ?? CupertinoDatePickerData.kDefaultShowDayOfWeek,
        showTimeSeparator:
            cupertinoDatePickerData?.showTimeSeparator ??
            CupertinoDatePickerData.kDefaultShowTimeSeparator,
        use24hFormat:
            cupertinoDatePickerData?.use24hFormat ?? CupertinoDatePickerData.kDefaultUse24hFormat,
      );

      await showCupertinoModalPopup<void>(
        context: context,
        anchorPoint: cupertinoDatePickerData?.anchorPoint ?? anchorPoint,
        barrierColor:
            cupertinoDatePickerData?.barrierColor ??
            barrierColor ??
            CupertinoDatePickerData.kDefaultModalBarrierColor,
        barrierDismissible:
            cupertinoDatePickerData?.barrierDismissible ??
            barrierDismissible ??
            kCupertinoBarrierDismissible,
        routeSettings: cupertinoDatePickerData?.routeSettings ?? routeSettings,
        useRootNavigator: cupertinoDatePickerData?.useRootNavigator ?? useRootNavigator,
        filter: cupertinoDatePickerData?.filter,
        requestFocus: cupertinoDatePickerData?.requestFocus,
        semanticsDismissible:
            cupertinoDatePickerData?.semanticsDismissible ??
            CupertinoDatePickerData.kDefaultSemanticsDismissible,
        builder: (context) =>
            resolvedBuilder?.call(context, pickerWidget) ??
            _CupertinoPickerContainer(pickerWidget: pickerWidget),
      );

      return selectedDateTime.toDate();
    },
  );
}