import 'dart:convert'; import 'dart:io'; import 'package:dio/dio.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import '../api/http.dart' as http; 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 '../ui/widget/nav.dart'; import 'package:image_gallery_saver/image_gallery_saver.dart'; import 'config_util.dart'; import 'package:package_info/package_info.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(this.context, _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) { // PackageInfo.fromPlatform().then((PackageInfo packageInfo) { if (callbackName != null) { callback(callbackName, packageInfo.appName); } }); } //toast toast(params) { if (params != null && params["msg"] != null) { ToastUtil.toast(params["msg"], context); } } 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(BuildContext context, String? callbackName) { // AdUtil.getAdInfo(context, 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() { popPage(context); } //结束页面 finishPage() { popPage(context); } 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) { await ImageGallerySaver.saveFile(path); return true; } else { return false; } } catch (e) { ToastUtil.toast("网络连接失败", context); return false; } } //保存图片 saveImg(String url) { Future dir; if (Platform.isAndroid) { dir = getExternalStorageDirectory(); } else { dir = getApplicationDocumentsDirectory(); } dir.then((value) { if (value == null) { ToastUtil.toast("获取缓存目录失败", context); return; } String doc = value.path; String path = doc + "/" + EncryptUtil.MD5(url) + ".png"; _dowloadImg(url, path).then((value) { if (value) { ToastUtil.toast("保存成功", context); } }); }); } ///分享图片 ///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; } } }); }); } }