flutter-web中使用js工具类

简介: flutter-web中使用js工具类

为什么要调用js

JavaScript拥有庞大且成熟的工具生态系统

1. flutter-web

1. 引入js web/index.html
 <!-- Add the required JS libraries -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js" integrity="sha512-a+SUDuwNzXDvz4XrIcXHuCf089/iJAoN4lmrXJg18XnduKK6YlDHNRalv4yd1N40OKI80tFidF+rqTFKGPoWFQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/md5.min.js" integrity="sha512-ENWhXy+lET8kWcArT6ijA6HpVEALRmvzYBayGL6oFWl96exmq8Fjgxe2K6TAblHLP75Sa/a1YjHpIZRt+9hGOQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

  <!-- Register the js file where the logic is written -->
  <script src="CryptoEnc.js" type="application/javascript"></script>
2. 创建工具js web/CryptoEnc.js
function CryptoEnc() {}

CryptoEnc.prototype.encrypt = function(toEncObj){
    var toEnc = toEncObj.value;

    var encrypted = CryptoJS.MD5(toEnc);

    return encrypted;
}


CryptoEnc.prototype.testFunc = function(toEncObj2){
  var toEnc = toEncObj2.value;
    return "========bbbbtestFunc"+toEnc;
}

3. 创建对应的lib/js/js_interop.dart
// #1
@JS()
library js_interop;

// The above two lines are required
import 'package:js/js.dart';

// #2
@JS()
class CryptoEnc {
  external CryptoEnc();

  external String encrypt(ToEncrypt toEncrypt);
  external String testFunc(ToEncrypt2 toEncrypt2);
}

// #3
@JS()
@anonymous
class ToEncrypt {
  external String get value;

  external factory ToEncrypt({String value});
}
@JS()
@anonymous
class ToEncrypt2 {
  external String get value;

  external factory ToEncrypt2({String value});
}


4. 由于引入的js是针对web平台的,所以引入需要做引入处理
///encrypt.dart
class ToEncrypt {
  final String value;

  ToEncrypt({
    required this.value,
  });
}

class ToEncrypt2 {
  final String value;

  ToEncrypt2({
    required this.value,
  });
}

class CryptoEnc {
  CryptoEnc();

  String encrypt(ToEncrypt toEncrypt) {
    // We are not implementing any encryption for mobile for now.
    // This is just for demonstration.
    throw UnimplementedError();
  }
  String testFunc(ToEncrypt2 toEncrypt) {
    // We are not implementing any encryption for mobile for now.
    // This is just for demonstration.
    throw UnimplementedError();
  }
}

///export_encrypt.dart
export 'encrypt.dart' if (dart.library.js) 'js_interop.dart';
5. 使用
   var encVal = CryptoEnc().encrypt(
      ToEncrypt(
        value: "aaaaaa",
      ),
    );
    var encVal2 = CryptoEnc().testFunc(ToEncrypt2(
      value: "cccc",
    ));
    print(encVal);
    print("testFunc=$encVal2");

2. Android

1. 引入依赖
webview_flutter: ^4.4.2
2. index.html
<!DOCTYPE html>
<html>
<head>
    <title>Test js dart</title>

</head>
<body>
<script>
   function inputClick (url) {
    console.log('inputClick=>'+url);
   }
   function playUrl(url) {
    console.log('playUrl=>'+url);
   }
   function startPlay() {
     console.log('startPlay');
   }
   function postMsg() {
     console.log('postMsg');
     //向dart发送消息
     Print.postMessage('postMsg');
   }

</script>
</body>
</html>
3. dart
import 'package:flutter/material.dart';
import 'package:tvboxstudy/log_extensions.dart';
import 'package:webview_flutter/webview_flutter.dart';

class LocalHtmlWebView extends StatefulWidget {
  const LocalHtmlWebView({super.key});

  @override
  LocalHtmlWebViewState createState() => LocalHtmlWebViewState();
}

class LocalHtmlWebViewState extends State<LocalHtmlWebView> {
  late String localHtmlContents;
  late WebViewController controller;
  ValueNotifier<bool> isShowLoading = ValueNotifier(true);

  @override
  void initState() {
    super.initState();
    initController();
    loadLocalHtml();
    _registerJavascriptChannel();
  }

  void runJS(int type) {
    if (type == 1) {
      controller.runJavaScript(
        'inputClick();',
      );
    } else if (type == 2) {
      controller.runJavaScript(
        'startPlay();',
      );
    }else if (type == 3) {
      controller.runJavaScript(
        'postMsg();',
      );
    } else if (type == 4) {
      controller.runJavaScript(
        "playUrl('https://media.w3.org/2010/05/sintel/trailer.mp4');",
      );
    }
  }

  void _registerJavascriptChannel() {
    controller.addJavaScriptChannel(
      'Print',
      onMessageReceived: (JavaScriptMessage message) {
        //收到消息做相应的处理
        print("onMessageReceived=>${message.message}");
      },
    );
  }

  void initController() {
    controller = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..setBackgroundColor(Colors.transparent)
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..setNavigationDelegate(
        NavigationDelegate(
          onProgress: (int progress) {
            "progress=$progress".log();
            if (progress == 100) {
              isShowLoading.value = false;
            }
          },
          onPageStarted: (String url) {},
          onPageFinished: (String url) {
            controller
                .runJavaScriptReturningResult('document.body.scrollHeight')
                .then((value) {
                  "scrollHeight=>$value".log();
            });
          },
          onWebResourceError: (WebResourceError error) {},
          onNavigationRequest: (NavigationRequest request) {
            if (request.url.startsWith('https://www.youtube.com/')) {
              return NavigationDecision.prevent;
            }
            return NavigationDecision.navigate;
          },
        ),
      );
  }

  void loadLocalHtml() async {
    controller.loadFlutterAsset('assets/www/player/index2.html');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          Row(
            children: [
              TextButton(onPressed: (){
                runJS(1);
              }, child: Text("inputClick")),
              TextButton(onPressed: (){
                runJS(2);
              }, child: Text("startPlay")),
              TextButton(onPressed: (){
                runJS(3);
              }, child: Text("postMsg")),
              TextButton(onPressed: (){
                runJS(4);
              }, child: Text("playUrl")),
            ],
          ),
          Expanded(
            child: Stack(
              children: [
                WebViewWidget(
                  controller: controller,
                ),
                ValueListenableBuilder(
                  valueListenable: isShowLoading,
                  builder: (BuildContext context, bool value, Widget? child) {
                    return isShowLoading.value
                        ? const Center(
                            child: CircularProgressIndicator(
                            color: Colors.white,
                          ))
                        : const SizedBox.shrink();
                  },
                )
              ],
            ),
          ),
        ],
      ),
    );
  }
}

相关文章
|
3月前
|
数据采集 Web App开发 JavaScript
Puppeteer的高级用法:如何在Node.js中实现复杂的Web Scraping
随着互联网的发展,网页数据抓取已成为数据分析和市场调研的关键手段。Puppeteer是一款由Google开发的无头浏览器工具,可在Node.js环境中模拟用户行为,高效抓取网页数据。本文将介绍如何利用Puppeteer的高级功能,通过设置代理IP、User-Agent和Cookies等技术,实现复杂的Web Scraping任务,并提供示例代码,展示如何使用亿牛云的爬虫代理来提高爬虫的成功率。通过合理配置这些参数,开发者可以有效规避目标网站的反爬机制,提升数据抓取效率。
267 4
Puppeteer的高级用法:如何在Node.js中实现复杂的Web Scraping
|
2月前
|
开发框架 JavaScript 前端开发
使用 Node.js 和 Express 构建 Web 应用
【10月更文挑战第2天】使用 Node.js 和 Express 构建 Web 应用
|
1月前
|
JavaScript 前端开发 持续交付
构建现代Web应用:Vue.js与Node.js的完美结合
【10月更文挑战第22天】随着互联网技术的快速发展,Web应用已经成为了人们日常生活和工作的重要组成部分。前端技术和后端技术的不断创新,为Web应用的构建提供了更多可能。在本篇文章中,我们将探讨Vue.js和Node.js这两大热门技术如何完美结合,构建现代Web应用。
35 4
|
2月前
|
存储 JavaScript 前端开发
深入探索 Vue.js:构建现代 Web 应用的利器
【10月更文挑战第11天】深入探索 Vue.js:构建现代 Web 应用的利器
24 1
|
2月前
|
JavaScript 前端开发 网络架构
如何使用Vue.js构建响应式Web应用
【10月更文挑战第9天】如何使用Vue.js构建响应式Web应用
|
2月前
|
JavaScript 前端开发
如何使用Vue.js构建响应式Web应用程序
【10月更文挑战第9天】如何使用Vue.js构建响应式Web应用程序
|
2月前
|
JavaScript 前端开发 开发者
前端开发趋势:从Web Components到Vue.js
【10月更文挑战第9天】前端开发趋势:从Web Components到Vue.js
|
3月前
|
数据采集 存储 JavaScript
Puppeteer的高级用法:如何在Node.js中实现复杂的Web Scraping
在现代Web开发中,数据采集尤为重要,尤其在财经领域。本文以“东财股吧”为例,介绍如何使用Puppeteer结合代理IP技术进行高效的数据抓取。Puppeteer是一个强大的Node.js库,支持无头浏览器操作,适用于复杂的数据采集任务。通过设置代理IP、User-Agent及Cookies,可显著提升抓取成功率与效率,并以示例代码展示具体实现过程,为数据分析提供有力支持。
116 2
Puppeteer的高级用法:如何在Node.js中实现复杂的Web Scraping
|
2月前
|
Web App开发 JavaScript 前端开发
使用Node.js和Express框架构建Web服务器
使用Node.js和Express框架构建Web服务器
|
3月前
|
Web App开发 JavaScript 前端开发
构建高效Web应用:Node.js与Express框架的深度整合
【9月更文挑战第28天】在现代Web开发领域,Node.js和Express框架的结合已成为打造高性能、易扩展应用的黄金组合。本文将深入探讨如何利用这一技术栈优化Web应用架构,提供具体实践指导,并分析其性能提升的内在机制。通过代码示例,我们将展示从基础搭建到高级功能的实现过程,旨在为开发者提供一条清晰的学习路径,以实现技术升级和项目效率的双重提升。
54 3