初始化

This commit is contained in:
谢宇宁
2026-09-15 15:44:13 +07:00
commit a23ba685e9
1065 changed files with 101122 additions and 0 deletions
+157
View File
@@ -0,0 +1,157 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:hgdj/assets_tool/app_colors.dart';
import 'package:hgdj/hj_utils/screen.dart';
import 'package:hgdj/tools_base/widget/common_dialog.dart';
/// 全站统一的提示/确认弹窗:标题 + 分割线 + 正文 + 副文案 + 灰「取消」红「确定」双按钮。
/// 壳走 [CommonDialog],业务结果一律用返回值传(点确定=true),别在弹窗里塞跳转逻辑。
/// 统一走 [show],别自己套 Get.dialog——barrierDismissible 要同时给到两层才生效。
class CommonAlert extends StatelessWidget {
final String title;
final String? content; //正文,16/半透明白
final String? subContent; //副文案,接在正文下方
final bool showDivider; //标题下的分割线
final bool showCancel; //false = 只有一个确定按钮
final String cancelText;
final String confirmText;
final bool barrierDismissible; //false = 只能点按钮,见 CommonDialog 同名参数
const CommonAlert({
super.key,
this.title = '温馨提示',
this.content,
this.subContent,
this.showDivider = true,
this.showCancel = true,
this.cancelText = '取消',
this.confirmText = '确定',
this.barrierDismissible = true,
});
/// 弹出并等待结果:true = 点了确定,点取消/遮罩/返回键都是 false。
/// [barrierDismissible] 传 false 则必须点按钮才能关(权限、强制重试这类场景)
static Future<bool> show({
String title = '温馨提示',
String? content,
String? subContent,
bool showDivider = true,
bool showCancel = true,
String cancelText = '取消',
String confirmText = '确定',
bool barrierDismissible = true,
}) async {
final res = await Get.dialog<bool>(
CommonAlert(
title: title,
content: content,
subContent: subContent,
showDivider: showDivider,
showCancel: showCancel,
cancelText: cancelText,
confirmText: confirmText,
barrierDismissible: barrierDismissible,
),
barrierDismissible: barrierDismissible,
);
return res ?? false;
}
@override
Widget build(BuildContext context) {
return CommonDialog(
//点正文不关:结果只认按钮,误触关掉会被当成「取消」
canTapClose: false,
barrierDismissible: barrierDismissible,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
title,
style: TextStyle(
color: Colors.white.withValues(alpha: .9),
fontSize: 20,
fontWeight: FontWeight.w600),
),
if (showDivider) ...[
12.sizeBoxH,
0.5.line,
],
if (content?.isNotEmpty == true) ...[
12.sizeBoxH,
Text(
content!,
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white.withValues(alpha: .5),
fontSize: 16,
fontWeight: FontWeight.w500),
),
],
if (subContent?.isNotEmpty == true) ...[
20.sizeBoxH,
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Text(
subContent!,
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white.withValues(alpha: .5), fontSize: 16),
),
),
],
31.sizeBoxH,
SizedBox(
height: 44,
child: Row(
children: [
if (showCancel) ...[
InkWell(
enableFeedback: false,
onTap: () => Get.back(result: false),
child: Container(
width: 112,
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.white.withValues(alpha: .1),
borderRadius: BorderRadius.circular(3),
),
child: Text(
cancelText,
style: const TextStyle(
color: Color(0xff989898),
fontSize: 16,
fontWeight: FontWeight.w500),
),
),
),
12.sizeBoxW,
],
Expanded(
child: InkWell(
enableFeedback: false,
onTap: () => Get.back(result: true),
child: Container(
alignment: Alignment.center,
decoration: BoxDecoration(
color: AppColors.actionRed,
borderRadius: BorderRadius.circular(3),
),
child: Text(
confirmText,
style: const TextStyle(
color: Colors.white,
fontSize: 16,
fontWeight: FontWeight.w500),
),
),
),
),
],
),
),
],
),
);
}
}