showConfirm static method

Future<bool?> showConfirm({
  1. required BuildContext context,
  2. required String title,
  3. required String message,
  4. String? positiveButtonTitle,
  5. String? negativeButtonTitle,
})

Implementation

static Future<bool?> showConfirm({
  required BuildContext context,
  required String title,
  required String message,
  String? positiveButtonTitle,
  String? negativeButtonTitle,
}) {
  if (context.mounted) {
    return showDialog(
      context: context,
      builder: (context) => AlertDialog(
        title: Text(title),
        content: Text(message),
        actions: <Widget>[
          TextButton(
            onPressed: () {
              Navigator.of(context).pop(false);
            },
            child: Text(negativeButtonTitle ?? "No"),
          ),
          ElevatedButton(
            onPressed: () {
              Navigator.of(context).pop(true);
            },
            child: Text(positiveButtonTitle ?? "Yes"),
          ),
        ],
      ),
    );
  }

  final completer = Completer<bool?>();
  final entry = showOverlay(
    (overlayContext, progress) {
      void dismiss([bool? value]) {
        if (!completer.isCompleted) {
          completer.complete(value);
        }
        OverlaySupportEntry.of(overlayContext)?.dismiss();
      }

      return Stack(
        children: [
          Positioned.fill(
            child: GestureDetector(
              onTap: () => dismiss(null),
              behavior: HitTestBehavior.opaque,
              child: Container(color: Colors.black54),
            ),
          ),
          Center(
            child: Material(
              color: Colors.transparent,
              child: AlertDialog(
                title: Text(title),
                content: Text(message),
                actions: <Widget>[
                  TextButton(
                    onPressed: () => dismiss(false),
                    child: Text(negativeButtonTitle ?? "No"),
                  ),
                  ElevatedButton(
                    onPressed: () => dismiss(true),
                    child: Text(positiveButtonTitle ?? "Yes"),
                  ),
                ],
              ),
            ),
          ),
        ],
      );
    },
    duration: Duration.zero,
  );
  entry.dismissed.then((_) {
    if (!completer.isCompleted) {
      completer.complete(null);
    }
  });
  return completer.future;
}