- 添加导航条目和分类数据模型 - 实现导航卡片网格展示 - 支持点击卡片打开链接 - 添加主题样式(渐变色、卡片阴影) - 区分系统默认和自定义条目 - 添加分类统计信息"
92 lines
2.8 KiB
Dart
92 lines
2.8 KiB
Dart
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<bool> showConfirmDialog({
|
|
required BuildContext context,
|
|
required String title,
|
|
required String message,
|
|
required String confirmLabel,
|
|
String cancelLabel = '取消',
|
|
bool danger = false,
|
|
}) async {
|
|
final bool? confirmed = await showDialog<bool>(
|
|
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: <Widget>[
|
|
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: <Widget>[
|
|
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),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|