import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:hgdj/assets_tool/app_colors.dart'; import 'package:hgdj/assets_tool/images.dart'; import 'package:hgdj/config/config.dart'; import 'package:hgdj/hj_model/user/user_info_model.dart'; import 'package:hgdj/hj_utils/screen.dart'; import 'package:hgdj/tools_base/toast.dart'; import 'package:hgdj/tools_base/widget/common_dialog.dart'; import 'package:hgdj/tools_base/widget/net_image_widget.dart'; import 'package:qr_flutter/qr_flutter.dart'; import '../../config/address.dart'; import '../../hj_model/video_model.dart'; import '../../hj_utils/image_util.dart'; import '../../tools_base/global_store/store.dart'; ///分享二维码对话框 class ShareMediaDialog extends StatefulWidget { final VideoModel? videoModel; final bool needDecrypt; //封面是否需要解密(直播封面不加密,传 false) const ShareMediaDialog({ super.key, this.videoModel, this.needDecrypt = true, }); @override State createState() => _ShareMediaDialogState(); } class _ShareMediaDialogState extends State { final _shotKey = GlobalKey(); //保存图片时截取的范围 UserInfoModel? get _me => globalStore.meInfo; //推广链接:弹窗打开时取一次即可(二维码/复制都用它) late final String _shareUrl = _me?.promoteURL ?? ""; /// 复制链接 void _onCopyLink() { if (_shareUrl.isEmpty) { showToast("链接生成错误"); return; } Clipboard.setData(ClipboardData(text: _shareUrl)); showToast("复制成功,快去分享吧"); Get.back(); } /// 保存图片(必须等截图完成再关弹窗,否则 _shotKey 对应的 widget 已销毁) Future _onSaveImg() async { final ok = await ImageUtil.saveWidgetToAlbum(_shotKey); showToast(ok ? "保存成功,快去分享吧" : "保存失败,请重试"); if (mounted) Get.back(); // 保存期间弹窗可能已被关掉(连点/点了复制),别多 pop 一层 } @override Widget build(BuildContext context) { return CommonDialog( padding: EdgeInsets.zero, child: RepaintBoundary( key: _shotKey, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 23, vertical: 32), child: Column( mainAxisSize: MainAxisSize.min, children: [ //app 图标 + 名称 + 标语 Row( children: [ Image.asset('ic_launcher.webp'.commonImgPath, width: 48.w, height: 48.w), 10.w.sizeBoxW, Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Text( Config.appName, style: TextStyle( color: Colors.white.withValues(alpha: .9), fontWeight: FontWeight.w500, fontSize: 14), ), 4.sizeBoxH, Text("亚洲最火成人网站", style: TextStyle( color: Colors.white.withValues(alpha: .55), fontSize: 10)), ], ), ], ), 18.sizeBoxH, //视频封面 Padding( padding: const EdgeInsets.symmetric(horizontal: 27), child: NetworkImageLoader( width: double.infinity, imageUrl: widget.videoModel?.cover ?? "", fit: BoxFit.fitHeight, encrypt: widget.needDecrypt, ), ), 18.sizeBoxH, //二维码 + 邀请码 + 官网地址 SizedBox( height: 94, child: Row( children: [ Container( width: 94, height: 94, padding: const EdgeInsets.all(2), color: Colors.white, child: QrImageView( data: _shareUrl, padding: EdgeInsets.zero), ), 16.sizeBoxW, Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ Text( "邀请码${_me?.promotionCode ?? ""}", style: TextStyle( fontSize: 16, fontWeight: FontWeight.w500, color: Colors.white.withValues(alpha: .9)), ), 20.sizeBoxH, Text( '官方网址:${Address.groundUrl ?? ""}', maxLines: 2, style: TextStyle( fontSize: 12, color: Colors.white.withValues(alpha: .55)), ), ], ), ), ], ), ), 24.sizeBoxH, //底部两个按钮 Row( children: [ Expanded( child: _button( "复制链接", bgColor: Colors.white.withValues(alpha: .1), textColor: const Color(0xff989898), onTap: _onCopyLink, ), ), 16.sizeBoxW, Expanded( child: _button( "保存图片", bgColor: AppColors.actionRed, textColor: Colors.white, onTap: _onSaveImg, ), ), ], ), ], ), ), ), ); } Widget _button(String text, {required Color bgColor, required Color textColor, required VoidCallback onTap}) { return InkWell( enableFeedback: false, onTap: onTap, child: Container( height: 44, alignment: Alignment.center, decoration: BoxDecoration( borderRadius: BorderRadius.circular(3), color: bgColor, ), child: Text( text, style: TextStyle( fontSize: 16, color: textColor, fontWeight: FontWeight.w500), ), ), ); } }