Files
feature-next-arch/lib/components/confrim_dialog.dart

126 lines
3.4 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/material.dart';
/// 通用确认弹窗组件
/// 可自定义标题、内容、按钮文字、回调函数
class ConfirmDialog extends StatelessWidget {
/// 弹窗标题
final String title;
/// 弹窗内容文本
final String content;
/// 确认按钮文字(默认:确认)
final String confirmText;
/// 取消按钮文字(默认:取消)
final String cancelText;
/// 确认按钮文字颜色(默认:红色)
final Color confirmTextColor;
/// 确认按钮点击回调
final VoidCallback onConfirm;
/// 取消按钮点击回调(默认:关闭弹窗)
final VoidCallback? onCancel;
/// 弹窗是否可点击空白处关闭(默认:true)
final bool barrierDismissible;
const ConfirmDialog({
super.key,
required this.title,
required this.content,
required this.onConfirm,
this.confirmText = '确认',
this.cancelText = '取消',
this.confirmTextColor = Colors.red,
this.onCancel,
this.barrierDismissible = true,
});
/// 快速创建删除确认弹窗(封装常用的删除场景)
static void showDeleteConfirm({
required BuildContext context,
required String plotName,
required VoidCallback onDelete,
String title = '确认删除',
String confirmText = '删除',
String cancelText = '取消',
}) {
showDialog(
context: context,
barrierDismissible: true,
builder: (context) => ConfirmDialog(
title: title,
content: '是否删除?删除后不可恢复。',
confirmText: confirmText,
cancelText: cancelText,
confirmTextColor: Colors.red,
onConfirm: onDelete,
),
);
}
@override
Widget build(BuildContext context) {
return AlertDialog(
title: Text(title),
content: Text(content),
// 适配不同屏幕宽度
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
actions: [
TextButton(
onPressed: () {
// 优先调用自定义取消回调,否则默认关闭弹窗
if (onCancel != null) {
onCancel!();
} else {
Navigator.of(context).pop();
}
},
child: Text(cancelText),
),
TextButton(
onPressed: () {
// 执行确认回调
onConfirm();
// 关闭弹窗(如果回调里没处理的话)
if (Navigator.canPop(context)) {
Navigator.of(context).pop();
}
},
child: Text(confirmText, style: TextStyle(color: confirmTextColor)),
),
],
);
}
/// 显示通用确认弹窗的静态方法(全局调用)
static void show({
required BuildContext context,
required String title,
required String content,
required VoidCallback onConfirm,
String confirmText = '确认',
String cancelText = '取消',
Color confirmTextColor = Colors.red,
VoidCallback? onCancel,
bool barrierDismissible = true,
}) {
showDialog(
context: context,
barrierDismissible: barrierDismissible,
builder: (context) => ConfirmDialog(
title: title,
content: content,
confirmText: confirmText,
cancelText: cancelText,
confirmTextColor: confirmTextColor,
onConfirm: onConfirm,
onCancel: onCancel,
),
);
}
}