import 'package:flutter/material.dart'; import '../../../../core/constants/app_sizes.dart'; import '../../../../core/theme/app_colors.dart'; import '../../../../core/theme/app_text_styles.dart'; import 'dialog_buttons.dart'; /// 通用确认框,返回 true 表示用户点了确认。 /// /// [danger] 为 true 时确认按钮用错误色,用在删除这类不可逆操作上。 Future showConfirmDialog({ required BuildContext context, required String title, required String message, required String confirmLabel, String cancelLabel = '取消', bool danger = false, }) async { final bool? confirmed = await showDialog( context: context, barrierColor: const Color(0x73111827), builder: (BuildContext context) => _ConfirmDialog( title: title, message: message, confirmLabel: confirmLabel, cancelLabel: cancelLabel, danger: danger, ), ); return confirmed ?? false; } class _ConfirmDialog extends StatelessWidget { const _ConfirmDialog({ required this.title, required this.message, required this.confirmLabel, required this.cancelLabel, required this.danger, }); final String title; final String message; final String confirmLabel; final String cancelLabel; final bool danger; @override Widget build(BuildContext context) { return Dialog( backgroundColor: Colors.transparent, elevation: 0, insetPadding: const EdgeInsets.all(AppSizes.dialogPadding), child: Container( constraints: const BoxConstraints(maxWidth: 360), decoration: BoxDecoration( color: AppColors.surface, border: Border.all(color: AppColors.border), borderRadius: BorderRadius.circular(AppSizes.cardRadius), boxShadow: AppColors.cardShadowHover, ), padding: const EdgeInsets.all(AppSizes.dialogPadding), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(title, style: AppTextStyles.sectionTitle), const SizedBox(height: AppSizes.spaceSm), Text(message, style: AppTextStyles.emptyMessage), const SizedBox(height: AppSizes.spaceXl), Row( mainAxisAlignment: MainAxisAlignment.end, children: [ DialogGhostButton( label: cancelLabel, onTap: () => Navigator.of(context).pop(false), ), const SizedBox(width: AppSizes.spaceMd), DialogPrimaryButton( label: confirmLabel, danger: danger, onTap: () => Navigator.of(context).pop(true), ), ], ), ], ), ), ); } }