defaultDialog<T> method

Future<T?> defaultDialog<T>({
  1. String title = 'Alert',
  2. EdgeInsetsGeometry? titlePadding,
  3. TextStyle? titleStyle,
  4. Widget? content,
  5. String? id,
  6. EdgeInsetsGeometry? contentPadding,
  7. VoidCallback? onConfirm,
  8. VoidCallback? onCancel,
  9. VoidCallback? onCustom,
  10. Color? cancelTextColor,
  11. Color? confirmTextColor,
  12. String? textConfirm,
  13. String? textCancel,
  14. String? textCustom,
  15. Widget? confirm,
  16. Widget? cancel,
  17. Widget? custom,
  18. Color? backgroundColor,
  19. bool barrierDismissible = true,
  20. Color? buttonColor,
  21. String middleText = '\n',
  22. TextStyle? middleTextStyle,
  23. double radius = 20.0,
  24. List<Widget>? actions,
  25. PopInvokedCallback? onWillPop,
  26. GlobalKey<NavigatorState>? navigatorKey,
})

Custom UI Dialog.

Implementation

Future<T?> defaultDialog<T>({
  String title = 'Alert',
  EdgeInsetsGeometry? titlePadding,
  TextStyle? titleStyle,
  Widget? content,
  String? id,
  EdgeInsetsGeometry? contentPadding,
  VoidCallback? onConfirm,
  VoidCallback? onCancel,
  VoidCallback? onCustom,
  Color? cancelTextColor,
  Color? confirmTextColor,
  String? textConfirm,
  String? textCancel,
  String? textCustom,
  Widget? confirm,
  Widget? cancel,
  Widget? custom,
  Color? backgroundColor,
  bool barrierDismissible = true,
  Color? buttonColor,
  String middleText = '\n',
  TextStyle? middleTextStyle,
  double radius = 20.0,
  //   ThemeData themeData,
  List<Widget>? actions,

  // onWillPop Scope
  PopInvokedCallback? onWillPop,

  // the navigator used to push the dialog
  GlobalKey<NavigatorState>? navigatorKey,
}) {
  final bool leanCancel = onCancel != null || textCancel != null;
  final bool leanConfirm = onConfirm != null || textConfirm != null;
  actions ??= <Widget>[];

  if (cancel != null) {
    actions.add(cancel);
  } else {
    if (leanCancel) {
      actions.add(TextButton(
        style: TextButton.styleFrom(
          tapTargetSize: MaterialTapTargetSize.shrinkWrap,
          padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8),
          shape: RoundedRectangleBorder(
            side: BorderSide(
                color: buttonColor ?? theme.colorScheme.secondary, width: 2),
            borderRadius: BorderRadius.circular(radius),
          ),
        ),
        onPressed: () {
          if (onCancel == null) {
            closeAllDialogs();
          } else {
            onCancel.call();
          }
        },
        child: Text(
          textCancel ?? 'Cancel',
          style: TextStyle(
            color: cancelTextColor ?? theme.colorScheme.secondary,
          ),
        ),
      ));
    }
  }
  if (confirm != null) {
    actions.add(confirm);
  } else {
    if (leanConfirm) {
      actions.add(
        TextButton(
          style: TextButton.styleFrom(
            tapTargetSize: MaterialTapTargetSize.shrinkWrap,
            backgroundColor: buttonColor ?? theme.colorScheme.secondary,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(radius),
            ),
          ),
          child: Text(
            textConfirm ?? 'Ok',
            style: TextStyle(
              color: confirmTextColor ?? theme.colorScheme.background,
            ),
          ),
          onPressed: () {
            onConfirm?.call();
          },
        ),
      );
    }
  }

  final Widget baseAlertDialog = AlertDialog(
    titlePadding: titlePadding ?? const EdgeInsets.all(8),
    contentPadding: contentPadding ?? const EdgeInsets.all(8),
    backgroundColor: backgroundColor ?? theme.dialogBackgroundColor,
    shape: RoundedRectangleBorder(
      borderRadius: BorderRadius.all(
        Radius.circular(radius),
      ),
    ),
    title: Text(title, textAlign: TextAlign.center, style: titleStyle),
    content: custom ??
        Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            content ??
                Text(
                  middleText,
                  textAlign: TextAlign.center,
                  style: middleTextStyle,
                ),
            const SizedBox(height: 16),
            ButtonTheme(
              minWidth: 78.0,
              height: 34.0,
              child: Wrap(
                alignment: WrapAlignment.center,
                spacing: 8,
                runSpacing: 8,
                children: actions,
              ),
            )
          ],
        ),
    buttonPadding: EdgeInsets.zero,
  );

  return dialog<T>(
    onWillPop != null
        ? PopScope(
            onPopInvoked: onWillPop,
            child: baseAlertDialog,
          )
        : baseAlertDialog,
    barrierDismissible: barrierDismissible,
    navigatorKey: navigatorKey,
    id: id,
  );
}