import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:webview_flutter/webview_flutter.dart'; import '../resource/assets.gen.dart'; import '../resource/colors.gen.dart'; import '../resource/string.gen.dart'; class AlipayQrCodeDialog { static const String _tag = 'AlipayQrCodeDialog'; static void show( {required String qrCodeHtml, VoidCallback? onDismiss, VoidCallback? onCloseCallback, VoidCallback? loadSuccessCallback}) { SmartDialog.show( tag: _tag, onDismiss: onDismiss, backDismiss: false, builder: (_) { return AlipayQrCodeView( qrCodeHtml: qrCodeHtml, onCloseCallback: onCloseCallback, loadSuccessCallback: loadSuccessCallback); }, clickMaskDismiss: false); } static void dismiss() { SmartDialog.dismiss(tag: _tag); } } class AlipayQrCodeView extends Dialog { final String qrCodeHtml; VoidCallback? loadSuccessCallback; VoidCallback? onCloseCallback; final WebViewController webViewController = WebViewController(); AlipayQrCodeView( {super.key, required this.qrCodeHtml, this.onCloseCallback, this.loadSuccessCallback}); @override Widget build(BuildContext context) { return IntrinsicHeight( child: Column( children: [ Container( padding: EdgeInsets.all(26.w), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(10.w), ), child: Column( children: [ SizedBox( width: 220.w, height: 220.w, child: WebViewWidget( controller: webViewController ..loadHtmlString(getHtmlTemplate()) ..setJavaScriptMode(JavaScriptMode.unrestricted) ..setNavigationDelegate(NavigationDelegate( onPageFinished: (String url) { // 使用 CSS 放大页面内容 final scaleFactor = Get.width / 45.w; webViewController.runJavaScript(''' document.body.style.transform = "scale($scaleFactor)"; document.body.style.transformOrigin = "0 0"; document.body.style.touchAction = 'none'; document.documentElement.style.overscrollBehavior = 'none'; '''); loadSuccessCallback?.call(); loadSuccessCallback = null; }, )), ), ), SizedBox(height: 16.w), Text(StringName.alipayQrCodeTips, style: TextStyle(fontSize: 14.sp, color: ColorName.black90)) ], ), ), SizedBox(height: 20.w), GestureDetector( onTap: () { onCloseCallback?.call(); AlipayQrCodeDialog.dismiss(); }, child: Assets.images.iconMemberRetainClose .image(width: 32.w, height: 32.w)) ], ), ); } String getHtmlTemplate() { return ''' Alipay QR Code $qrCodeHtml '''; } }