import 'dart:convert'; import 'package:flutter/services.dart'; import 'package:fluwx/fluwx.dart'; import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/flavors.dart'; import 'package:star_lock/mine/valueAddedServices/advancedFeaturesWeb/advancedFeaturesWeb_entity.dart'; import 'package:star_lock/mine/valueAddedServices/advancedFeaturesWeb/advancedFeaturesWeb_state.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/pay/wx_pay_tool.dart'; import 'package:star_lock/webview/webview_logic.dart'; import 'package:webview_flutter/webview_flutter.dart'; class AdvancedFeaturesWebLogic extends BaseGetXController { late AdvancedFeaturesWebState state = AdvancedFeaturesWebState(); DateTime? _lastPressedAt; // 记录上一次按下返回键的时间 //获取购买跳转地址 Future getVipBuyURLRequest() async { AdvancedFeaturesWebEntity entity = await ApiRepository.to.getServicePackageBuyUrl(); if (entity.errorCode!.codeIsSuccessful) { state.vipBuyUrl.value = state.isShop.value == true ? entity.data!.shopList! : entity.data!.cloudauthBuyUrl!; state.vipBuyWebView.setNavigationDelegate( NavigationDelegate( onProgress: (int progress) { // Update loading bar. state.webProgress.value = progress / 100; }, onPageStarted: (String url) { state.webProgress.value = 0.0; }, onPageFinished: (String url) { state.webProgress.value = 1.0; }, onWebResourceError: (WebResourceError error) {}, onNavigationRequest: (NavigationRequest request) async { //路由跳转逻辑 if (WebViewLogic.judgePaySchemes(request.url)) { await WebViewLogic.runScheme(request.url); return NavigationDecision.prevent; } return NavigationDecision.navigate; }, ), ); state.vipBuyWebView.loadRequest(Uri.parse(state.vipBuyUrl.value)); state.vipBuyWebView.addJavaScriptChannel( "FlutterBridge", onMessageReceived: (JavaScriptMessage message) async { flutterBridge(message); }, ); } } //监听webview的调用 Future flutterBridge(JavaScriptMessage message) async { final dynamic obj = jsonDecode(message.message); AppLog.log(obj); if (obj is! Map && obj['action'] is String) { return; } String action = obj['action']; dynamic data = obj['data']; String? callFun = obj['callFun']; switch (action) { case 'WechatPayParams': //微信支付 wxPay(data, callFun); break; } } //微信支付 Future wxPay(dynamic data, String? callFun) async { WxPayTool.pay(WxPayTool.mapToPayment(data), (response) { if (response is WeChatPaymentResponse) { Map data = { 'type': response.type, 'extData': response.extData, 'errCode': response.errCode, 'errStr': response.errStr, }; state.vipBuyWebView.runJavaScript( 'window.$callFun(`${json.encode(data)}`)', ); } }); } //判断webview 是否可以有路由可以回退,无则退出当前页面 Future canGoBack(bool didPop) async { bool canGoBack = await state.vipBuyWebView.canGoBack(); if (canGoBack) { await state.vipBuyWebView.goBack(); } else if (state.allowReturn) { Get.back(); } else { if (_lastPressedAt == null || DateTime.now().difference(_lastPressedAt!) > const Duration(seconds: 2)) { // 如果两次返回键时间间隔大于 2 秒,则提示再次按下返回键退出 _lastPressedAt = DateTime.now(); showToast('再返回一次退出${F.title}'); return false; } SystemNavigator.pop(); return true; } refreshGoBack(); return false; } //刷新当前路由状态 void refreshGoBack() { //如果属于一直返回按钮,则根据是否有路由可以回退刷新 if (state.allowReturn) { return; } state.vipBuyWebView.canGoBack().then((value) { state.canGoBack = value; update(); }); } @override Future onReady() async { super.onReady(); } @override void onInit() { super.onInit(); getVipBuyURLRequest(); } }