Files
flutterApp/lib/components/confrim_dialog.dart

126 lines
3.4 KiB
Dart
Raw Normal View History

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