showNativeDialog<T> function

Future<T?> showNativeDialog<T>(
  1. BuildContext context, {
  2. required String title,
  3. required List<DialogAction<T>> actions,
  4. required String content,
})

A native dialog which shows a CupertinoAlertDialog on iOS and a AlertDialog on Android.

Example:

showNativeDialog(
  context,
  title: 'Title',
  content: 'Content',
  actions: [
    DialogAction(text: 'Action', onTap: () {}),
  ],
);

Implementation

Future<T?> showNativeDialog<T>(
  BuildContext context, {
  required String title,
  required List<DialogAction<T>> actions,
  required String content,
}) {
  if (defaultTargetPlatform == TargetPlatform.iOS) {
    return showCupertinoDialog<T>(
      context: context,
      builder:
          (dialogContext) => CupertinoAlertDialog(
            title: Text(title),
            content: Text(content),
            actions:
                actions
                    .map(
                      (action) => CupertinoDialogAction(
                        onPressed: () async {
                          final result = await action.onTap();
                          if (dialogContext.mounted) Navigator.of(dialogContext).pop(result);
                        },
                        isDestructiveAction: action.isDestructiveAction,
                        child: Text(action.text, style: action.textStyle),
                      ),
                    )
                    .toList(),
          ),
    );
  } else {
    return showDialog<T?>(
      context: context,
      builder:
          (dialogContext) => AlertDialog(
            title: Text(title),
            content: Text(content),
            actions:
                actions
                    .map(
                      (action) => TextButton(
                        onPressed: () async {
                          final result = await action.onTap();
                          if (dialogContext.mounted) Navigator.of(dialogContext).pop(result);
                        },
                        child: Text(action.text, style: action.textStyle),
                      ),
                    )
                    .toList(),
          ),
    );
  }
}