show static method

Future<bool?> show(
  1. BuildContext context, {
  2. required String title,
  3. required String message,
  4. String? confirmText,
  5. String? cancelText,
  6. IconData? icon,
  7. Color? iconColor,
  8. Color? backgroundColor,
  9. Color? confirmButtonColor,
  10. Color? cancelButtonColor,
  11. bool? showCancelButton,
  12. VoidCallback? onConfirm,
  13. Future<bool> onConfirmAsync()?,
  14. VoidCallback? onCancel,
  15. bool? barrierDismissible,
  16. DialogAnimationType? animationType,
  17. DialogAnimationDirection? startAnimation,
  18. DialogAnimationDirection? endAnimation,
  19. bool isLoading = false,
  20. ValueNotifier<bool>? loadingNotifier,
  21. bool hideLikeCircle = false,
  22. ContentDesignStyle? designStyle,
  23. double? blur,
  24. ImageFilter? backdropFilter,
  25. Widget? child,
})

Shows a modern dialog with optional icon and buttons.

Returns true if the dialog was confirmed, false if cancelled, or null if dismissed without action.

Throws an AssertionError if title or message is empty.

Example:

final result = await SavePointsDialog.show(
  context,
  title: 'Confirm',
  message: 'Are you sure?',
  showCancelButton: true,
);
if (result == true) {
  // User confirmed
}

Implementation

static Future<bool?> show(
  BuildContext context, {
  required String title,
  required String message,
  String? confirmText,
  String? cancelText,
  IconData? icon,
  Color? iconColor,
  Color? backgroundColor,
  Color? confirmButtonColor,
  Color? cancelButtonColor,
  bool? showCancelButton,
  VoidCallback? onConfirm,
  Future<bool> Function()? onConfirmAsync,
  VoidCallback? onCancel,
  bool? barrierDismissible,
  DialogAnimationType? animationType, // For backward compatibility
  DialogAnimationDirection? startAnimation,
  DialogAnimationDirection? endAnimation,
  bool isLoading = false,
  ValueNotifier<bool>? loadingNotifier,
  bool hideLikeCircle = false,
  ContentDesignStyle? designStyle,
  double? blur,
  ImageFilter? backdropFilter,
  Widget? child,
}) {
  // Validate required parameters
  assert(title.isNotEmpty, 'Title cannot be empty');
  // Message can be empty if a custom child is provided

  // Dismiss keyboard when showing dialog to prevent UI overlap
  _dismissKeyboard(context);

  final config = SnackDiaBottomConfig().dialog;
  final theme = Theme.of(context);
  final isDark = theme.brightness == Brightness.dark;

  final finalConfirmText = confirmText ?? config.defaultConfirmText;
  final finalCancelText = cancelText ?? config.defaultCancelText;
  final finalShowCancelButton =
      showCancelButton ?? config.defaultShowCancelButton;
  final finalBarrierDismissible =
      barrierDismissible ?? config.defaultBarrierDismissible;
  final finalBackgroundColor =
      backgroundColor ?? config.defaultBackgroundColor;
  final finalConfirmButtonColor =
      confirmButtonColor ?? config.defaultConfirmButtonColor;
  final finalCancelButtonColor =
      cancelButtonColor ?? config.defaultCancelButtonColor;

  final ImageFilter? barrierFilter =
      backdropFilter ??
      (blur != null && blur <= 0
          ? null
          : ImageFilter.blur(sigmaX: blur ?? 20.0, sigmaY: blur ?? 20.0));
  final useBarrierBlur = barrierFilter != null;
  final finalDesignStyle = designStyle ?? config.defaultDesignStyle;

  // Capture child parameter before it's shadowed by transitionBuilder
  final customChild = child;

  return showGeneralDialog<bool>(
    context: context,
    barrierDismissible: finalBarrierDismissible,
    barrierLabel: config.barrierLabel,
    barrierColor: useBarrierBlur ? Colors.transparent : config.barrierColor,
    transitionDuration: config.transitionDuration,
    pageBuilder: (_, _, _) => const SizedBox.shrink(),
    transitionBuilder: (context, animation, secondaryAnimation, child) {
      return DialogTransitionScope(
        animation: animation,
        animationType: (startAnimation == null && endAnimation == null)
            ? (animationType ?? config.defaultAnimation)
            : null,
        startAnimation: startAnimation,
        endAnimation: endAnimation,
        hideLikeCircle: hideLikeCircle,
        useBarrierBlur: useBarrierBlur,
        barrierFilter: barrierFilter,
        barrierDismissible: finalBarrierDismissible,
        title: title,
        message: message,
        confirmText: finalConfirmText,
        cancelText: finalCancelText,
        icon: icon,
        iconColor: iconColor,
        backgroundColor: finalBackgroundColor,
        confirmButtonColor: finalConfirmButtonColor,
        cancelButtonColor: finalCancelButtonColor,
        showCancelButton: finalShowCancelButton,
        onConfirm: onConfirm,
        onConfirmAsync: onConfirmAsync,
        onCancel: onCancel,
        isDark: isDark,
        isLoading: isLoading,
        loadingNotifier: loadingNotifier,
        designStyle: finalDesignStyle,
        blur: blur,
        backdropFilter: backdropFilter,
        child: customChild,
      );
    },
  );
}