126 lines
3.4 KiB
Dart
126 lines
3.4 KiB
Dart
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,
|
||
),
|
||
);
|
||
}
|
||
}
|