| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- import 'package:flutter/material.dart';
- import 'package:flutter_screenutil/flutter_screenutil.dart';
- import 'package:get/get.dart';
- import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
- import 'package:screenshot/screenshot.dart';
- import 'package:nomo/app/widgets/click_opacity.dart';
- import '../../../../config/theme/dark_theme_colors.dart';
- import '../../../../config/translations/strings_enum.dart';
- import '../../../../utils/formater.dart';
- import '../../../constants/assets.dart';
- import '../../../widgets/ix_image.dart';
- import '../../../widgets/submit_btn.dart';
- import '../controllers/precode_controller.dart';
- /// Pre Code 保存弹窗
- class PrecodeSaveDialog extends StatelessWidget {
- final PrecodeController controller;
- const PrecodeSaveDialog({super.key, required this.controller});
- @override
- Widget build(BuildContext context) {
- return _buildDialogContent();
- }
- /// 构建弹窗内容
- Widget _buildDialogContent() {
- return Padding(
- padding: EdgeInsets.all(24.w),
- child: Column(
- mainAxisSize: MainAxisSize.min,
- children: [
- Screenshot(
- controller: controller.screenshotController,
- child: Container(
- width: double.infinity,
- decoration: BoxDecoration(
- color: Get.reactiveTheme.highlightColor,
- borderRadius: BorderRadius.circular(20.r),
- ),
- child: Column(
- mainAxisSize: MainAxisSize.min,
- children: [
- // 内容区域
- Padding(
- padding: EdgeInsets.symmetric(
- horizontal: 10.w,
- vertical: 20.w,
- ),
- child: Column(
- mainAxisSize: MainAxisSize.min,
- children: [
- // Logo
- _buildLogo(),
- 10.verticalSpaceFromWidth,
- Divider(
- color: Get.reactiveTheme.dividerColor,
- height: 1.w,
- ),
- 10.verticalSpaceFromWidth,
- // Pre Code 标题和数字
- _buildPreCode(),
- 10.verticalSpaceFromWidth,
- Divider(
- color: Get.reactiveTheme.dividerColor,
- height: 1.w,
- ),
- 10.verticalSpaceFromWidth,
- // 说明文字
- _buildDescription(),
- 20.verticalSpaceFromWidth,
- // 安全提示
- _buildSecurityTip(),
- 20.verticalSpaceFromWidth,
- // UID 信息
- _buildUidInfo(),
- 10.verticalSpaceFromWidth,
- // Premium 标签
- _buildPremiumBadge(),
- ],
- ),
- ),
- ],
- ),
- ),
- ),
- 50.verticalSpaceFromWidth,
- // Save 按钮
- _buildSaveButton(),
- 20.verticalSpaceFromWidth,
- // Cancel 按钮
- _buildCancelButton(),
- ],
- ),
- );
- }
- /// Logo - 盾牌形状
- Widget _buildLogo() {
- return IXImage(
- source: Assets.splashLogo,
- width: 70.w,
- height: 94.w,
- sourceType: ImageSourceType.asset,
- );
- }
- /// Pre Code
- Widget _buildPreCode() {
- return Column(
- children: [
- Text(
- controller.preCode.value,
- style: TextStyle(
- fontSize: 28.sp,
- height: 1.2,
- fontWeight: FontWeight.w500,
- color: Get.reactiveTheme.textTheme.bodyLarge!.color,
- letterSpacing: 1.2,
- ),
- ),
- ],
- );
- }
- /// 说明文字
- Widget _buildDescription() {
- return Text(
- Strings.preCodeInfoMessage.tr,
- textAlign: TextAlign.center,
- style: TextStyle(
- fontSize: 14.sp,
- color: Get.reactiveTheme.hintColor,
- height: 1.4,
- ),
- );
- }
- /// 安全提示
- Widget _buildSecurityTip() {
- return Text(
- Strings.pleaseStoreSecurely.tr,
- textAlign: TextAlign.center,
- style: TextStyle(
- fontSize: 14.sp,
- color: Get.reactiveTheme.hintColor,
- height: 1.4,
- ),
- );
- }
- /// UID 信息
- Widget _buildUidInfo() {
- final uid = controller.uid;
- final displayUid = 'UID ${formatDeviceId(uid)}';
- return Text(
- displayUid,
- style: TextStyle(
- fontSize: 14.sp,
- color: DarkThemeColors.validTermColor,
- height: 1.4,
- ),
- );
- }
- /// Premium 标签
- Widget _buildPremiumBadge() {
- return Obx(
- () => IXImage(
- source: controller.isPremium.value ? Assets.premium : Assets.free,
- width: controller.isPremium.value ? 92.w : 64.w,
- height: 28.w,
- sourceType: ImageSourceType.asset,
- ),
- );
- }
- /// Save 按钮
- Widget _buildSaveButton() {
- return SubmitButton(
- prefixIcon: IXImage(
- source: Assets.preCodeSaveLocal,
- width: 20.w,
- height: 20.w,
- sourceType: ImageSourceType.asset,
- ),
- text: Strings.save.tr,
- onPressed: controller.saveToGallery,
- );
- }
- /// Cancel 按钮
- Widget _buildCancelButton() {
- return ClickOpacity(
- onTap: () {
- Navigator.of(Get.context!).pop();
- },
- child: Container(
- height: 52.w,
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(12.r),
- border: Border.all(color: Get.reactiveTheme.dividerColor, width: 1.w),
- ),
- alignment: Alignment.center,
- child: Text(
- Strings.cancel.tr,
- style: TextStyle(
- fontSize: 14.sp,
- fontWeight: FontWeight.w600,
- color: Get.reactiveTheme.hintColor,
- ),
- ),
- ),
- );
- }
- }
- /// 盾牌形状裁剪器
- class ShieldClipper extends CustomClipper<Path> {
- @override
- Path getClip(Size size) {
- final path = Path();
- final width = size.width;
- final height = size.height;
- // 绘制盾牌形状
- path.moveTo(width * 0.5, 0); // 顶部中心
- // 右上圆弧
- path.quadraticBezierTo(width * 0.75, 0, width, height * 0.2);
- // 右侧直线
- path.lineTo(width, height * 0.6);
- // 底部曲线到中心点
- path.quadraticBezierTo(width, height * 0.85, width * 0.5, height);
- // 从底部中心到左侧
- path.quadraticBezierTo(0, height * 0.85, 0, height * 0.6);
- // 左侧直线
- path.lineTo(0, height * 0.2);
- // 左上圆弧
- path.quadraticBezierTo(0, 0, width * 0.25, 0);
- path.close();
- return path;
- }
- @override
- bool shouldReclip(CustomClipper<Path> oldClipper) => false;
- }
|