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,
|
|||
|
|
),
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|