alipay_qr_code_dialog.dart 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_screenutil/flutter_screenutil.dart';
  3. import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
  4. import 'package:get/get.dart';
  5. import 'package:webview_flutter/webview_flutter.dart';
  6. import '../resource/assets.gen.dart';
  7. import '../resource/colors.gen.dart';
  8. import '../resource/string.gen.dart';
  9. class AlipayQrCodeDialog {
  10. static const String _tag = 'AlipayQrCodeDialog';
  11. static void show(
  12. {required String qrCodeHtml,
  13. VoidCallback? onDismiss,
  14. VoidCallback? onCloseCallback,
  15. VoidCallback? loadSuccessCallback}) {
  16. SmartDialog.show(
  17. tag: _tag,
  18. onDismiss: onDismiss,
  19. backDismiss: false,
  20. builder: (_) {
  21. return AlipayQrCodeView(
  22. qrCodeHtml: qrCodeHtml,
  23. onCloseCallback: onCloseCallback,
  24. loadSuccessCallback: loadSuccessCallback);
  25. },
  26. clickMaskDismiss: false);
  27. }
  28. static void dismiss() {
  29. SmartDialog.dismiss(tag: _tag);
  30. }
  31. }
  32. class AlipayQrCodeView extends Dialog {
  33. final String qrCodeHtml;
  34. VoidCallback? loadSuccessCallback;
  35. VoidCallback? onCloseCallback;
  36. final WebViewController webViewController = WebViewController();
  37. AlipayQrCodeView(
  38. {super.key,
  39. required this.qrCodeHtml,
  40. this.onCloseCallback,
  41. this.loadSuccessCallback});
  42. @override
  43. Widget build(BuildContext context) {
  44. return IntrinsicHeight(
  45. child: Column(
  46. children: [
  47. Container(
  48. padding: EdgeInsets.all(26.w),
  49. decoration: BoxDecoration(
  50. color: Colors.white,
  51. borderRadius: BorderRadius.circular(10.w),
  52. ),
  53. child: Column(
  54. children: [
  55. SizedBox(
  56. width: 220.w,
  57. height: 220.w,
  58. child: WebViewWidget(
  59. controller: webViewController
  60. ..loadHtmlString(getHtmlTemplate())
  61. ..setJavaScriptMode(JavaScriptMode.unrestricted)
  62. ..setNavigationDelegate(NavigationDelegate(
  63. onPageFinished: (String url) {
  64. // 使用 CSS 放大页面内容
  65. final scaleFactor = Get.width / 45.w;
  66. webViewController.runJavaScript('''
  67. document.body.style.transform = "scale($scaleFactor)";
  68. document.body.style.transformOrigin = "0 0";
  69. document.body.style.touchAction = 'none';
  70. document.documentElement.style.overscrollBehavior = 'none';
  71. ''');
  72. loadSuccessCallback?.call();
  73. loadSuccessCallback = null;
  74. },
  75. )),
  76. ),
  77. ),
  78. SizedBox(height: 16.w),
  79. Text(StringName.alipayQrCodeTips,
  80. style: TextStyle(fontSize: 14.sp, color: ColorName.black90))
  81. ],
  82. ),
  83. ),
  84. SizedBox(height: 20.w),
  85. GestureDetector(
  86. onTap: () {
  87. onCloseCallback?.call();
  88. AlipayQrCodeDialog.dismiss();
  89. },
  90. child: Assets.images.iconMemberRetainClose
  91. .image(width: 32.w, height: 32.w))
  92. ],
  93. ),
  94. );
  95. }
  96. String getHtmlTemplate() {
  97. return '''
  98. <!DOCTYPE html><html lang=\"en\">
  99. <head><meta charset=\"UTF-8\"/>
  100. <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>
  101. <title>Alipay QR Code</title>
  102. </head>
  103. <body>$qrCodeHtml</body>
  104. </html>
  105. ''';
  106. }
  107. }