import 'dart:convert'; import 'package:flutter/services.dart'; import 'package:fluwx/fluwx.dart'; import 'package:get/get.dart'; import 'package:star_lock/flavors.dart'; import 'package:star_lock/main/lockMian/lockMain/xhj/lockMain_xhj_logic.dart'; import 'package:star_lock/mine/mall/lockMall_entity.dart'; import 'package:star_lock/mine/mall/lockMall_state.dart'; import 'package:star_lock/mine/mall/webview/webview_logic.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:webview_flutter/webview_flutter.dart'; import '../../tools/baseGetXController.dart'; import '../../tools/wechat/pay/wx_pay_tool.dart'; import '../../tools/wechat/wechatManageTool.dart'; class LockMallLogic extends BaseGetXController { late LockMallState state; DateTime? _lastPressedAt; // 记录上一次按下返回键的时间 LockMallLogic({required bool allowReturn}) : state = LockMallState(allowReturn: allowReturn); //获取商城跳转地址 Future getMallURLRequest() async { final LockMallDataEntity entity = await ApiRepository.to.getMallURLData(); if (entity.errorCode!.codeIsSuccessful) { state.lockMallUrl.value = entity.data!.url!; state.mallWebView.setNavigationDelegate( NavigationDelegate( onProgress: (int progress) { state.webProgress.value = progress / 100; }, onPageStarted: (String url) { state.webProgress.value = 0.0; }, onPageFinished: (String url) { state.webProgress.value = 1.0; refreshGoBack(); update(); }, onWebResourceError: (WebResourceError error) {}, onNavigationRequest: (NavigationRequest request) async { //路由跳转逻辑 if (WebViewLogic.judgePaySchemes(request.url)) { await WebViewLogic.runScheme(request.url); return NavigationDecision.prevent; } return NavigationDecision.navigate; }, ), ); state.mallWebView.loadRequest(Uri.parse(state.lockMallUrl.value)); state.mallWebView.addJavaScriptChannel( 'FlutterBridge', onMessageReceived: (JavaScriptMessage message) async { flutterBridge(message); }, ); } } //监听webview的调用 Future flutterBridge(JavaScriptMessage message) async { final dynamic obj = json.decode(message.message); if (obj is! Map && obj['action'] is String) { return; } final String action = obj['action']; final dynamic data = obj['data']; final String? callFun = obj['callFun']; switch (action) { case 'WechatPayParams': //微信支付 WechatManageTool.getAppInfo(() { wxPay(data, callFun); }); // wxPay(data, callFun); break; } } //微信支付 Future wxPay(dynamic data, String? callFun) async { WxPayTool.pay(WxPayTool.mapToPayment(data), (WeChatResponse response) { if (response is WeChatPaymentResponse) { final Map data = { 'type': response.type, 'extData': response.extData, 'errCode': response.errCode, 'errStr': response.errStr, }; state.mallWebView.runJavaScript( 'window.$callFun(`${json.encode(data)}`)', ); } }); } //判断webview 是否可以有路由可以回退,无则退出当前页面 Future canGoBack(bool didPop) async { final bool canGoBack = await state.mallWebView.canGoBack(); bool isMall = true; if (Get.isRegistered() && F.isXHJ) { isMall = Get.find().isMall; } if (canGoBack && isMall) { await state.mallWebView.goBack(); } else if (state.allowReturn && isMall) { Get.back(); } else { if (_lastPressedAt == null || DateTime.now().difference(_lastPressedAt!) > const Duration(seconds: 2)) { // 如果两次返回键时间间隔大于 2 秒,则提示再次按下返回键退出 _lastPressedAt = DateTime.now(); showToast('再返回一次退出'.tr + F.title); return false; // 阻止返回操作 } SystemNavigator.pop(); return true; } refreshGoBack(); return false; } //刷新当前路由状态 void refreshGoBack() { //如果属于一直返回按钮,则根据是否有路由可以回退刷新 if (state.allowReturn) { return; } state.mallWebView.canGoBack().then((bool value) { state.canGoBack = value; update(); }); } @override Future onReady() async { super.onReady(); } @override void onInit() { super.onInit(); getMallURLRequest(); } }