show static method
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> onConfirmAsync()?, - VoidCallback? onCancel,
- bool? barrierDismissible,
- DialogAnimationType? animationType,
- DialogAnimationDirection? startAnimation,
- DialogAnimationDirection? endAnimation,
- bool isLoading = false,
- ValueNotifier<
bool> ? loadingNotifier, - bool hideLikeCircle = false,
- ContentDesignStyle? designStyle,
- double? blur,
- ImageFilter? backdropFilter,
- 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,
);
},
);
}