import 'dart:convert'; import 'dart:io'; import 'package:dio/dio.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:fluttertoast/fluttertoast.dart'; import '../api/http.dart' as http; import '../utils/ad_util.dart'; import '../utils/encrypt_util.dart'; import '../utils/permission_util.dart'; import '../utils/share_utils.dart'; import '../utils/string_util.dart'; import '../utils/ui_constant.dart'; import '../utils/ui_utils.dart'; import '../utils/user_util.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:webview_flutter/platform_interface.dart'; import 'package:webview_flutter/webview_flutter.dart'; import 'package:path_provider/path_provider.dart'; import 'config_util.dart'; class JavascriptInterface { final BuildContext context; final WebViewController? _controller; JavascriptInterface( BuildContext this.context, WebViewController? this._controller); Set getInterfaces() { List list = []; list.add(JavascriptChannel( name: 'yestv', onMessageReceived: (JavascriptMessage message) { print("onMessageReceived"); var data = jsonDecode(message.message); String method = data["method"]; var params = data["params"]; String? _callback = data["callback"]; switch (method) { case "toast": toast(params); break; case "copyText": copyText(params); break; case "getUid": getUid(params, _callback); break; case "getAppName": getAppName(_callback); break; case "getRequestBaseParams": getRequestBaseParams(params, _callback); break; case "showRewardVideoAd": showRewardVideoAd(_callback); break; case "showLoading": showLoading(); break; case "hideLoading": hideLoading(); break; case "finishPage": finishPage(); break; case "saveImg": String url = params["url"]; saveImg(url); break; case "shareImg": String url = params["url"]; String type = params["type"]; shareImg(url, int.parse(type)); break; } })); return list.toSet(); } callback(String method, var params, {bool finish = true}) { _controller!.runJavascript("$method('$params')"); if (finish) { _controller!.runJavascript("delete $method"); } } //获取用户ID getUid(var params, String? callbackName) { if (callbackName != null) { UserUtil.getUid().then((value) { callback(callbackName, value != null ? value.toString() : ""); }); } } //获取用户ID getAppName(String? callbackName) { if (callbackName != null) { callback(callbackName, Constant.APP_NAME); } } //toast toast(params) { if (params != null && params["msg"] != null) { Fluttertoast.showToast(msg: params["msg"]); } } copyText(params) { if (params != null && params["content"] != null) { Clipboard.setData(ClipboardData(text: params["content"])); } } //获取基本的网络请求参数 getRequestBaseParams(var params, String? callbackName) { var ps = {}; if (params != null) { ps.addAll(params); } http.HttpUtil.getBaseParams(params).then((value) { String result = jsonEncode(value); if (callbackName != null) { callback(callbackName, result); } }); } //展示激励视频 showRewardVideoAd(String? callbackName) { AdUtil.getAdInfo(AdPosition.vipReward).then((value) { AdUtil.loadReward(value, (status, msg) { switch (status) { case RewardAdStatus.verify: callback(callbackName!, 3, finish: false); break; case RewardAdStatus.ready: callback(callbackName!, 1, finish: false); break; case RewardAdStatus.close: callback(callbackName!, 10, finish: true); break; case RewardAdStatus.click: callback(callbackName!, 2, finish: false); break; case RewardAdStatus.fail: callback(callbackName!, 0, finish: true); break; } }); }); } showLoading() { http.showLoading(context); } hideLoading() { Navigator.of(context).pop(); } //结束页面 finishPage() { Navigator.of(context).pop(); } Future _dowloadImg(String url, String path) async { PermissionStatus status = await PermissionUtil.openPermission(Permission.storage, force: true); if (status != PermissionStatus.granted) { return false; } //下载图片 Dio dio = Dio(); //设置连接超时时间 dio.options.connectTimeout = 20000; //设置数据接收超时时间 dio.options.receiveTimeout = 20000; Response response; try { response = await dio.download(url, path); if (response.statusCode == 200) { return true; } else { return false; } } catch (e) { ToastUtil.toast("网络连接失败"); return false; } } //保存图片 saveImg(String url) { getExternalStorageDirectory().then((value) { if (value == null) { ToastUtil.toast("获取缓存目录失败"); return; } String doc = value.path; String path = doc + "/" + EncryptUtil.MD5(url) + ".png"; _dowloadImg(url, path).then((value) { if (value) { ToastUtil.toast("保存成功"); } }); }); } ///分享图片 ///type: 1-微信 2-qq 3-新浪 shareImg(String url, int type) { getTemporaryDirectory().then((value) { String path = value.path + "/" + EncryptUtil.MD5(url) + ".png"; _dowloadImg(url, path).then((value) { if (value) { //开始分享 switch (type) { case 1: ShareUtil.shareImg(context, File(path), SharePlatform.wx); break; case 2: ShareUtil.shareImg(context, File(path), SharePlatform.qq); break; case 3: ShareUtil.shareImg(context, File(path), SharePlatform.sina); break; } } }); }); } }