alipay_qr_code_dialog.dart 3.8 KB

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