布景

之前一直在用flutter做混合开发,现在准备借助flutter多平台代码共用的才能做多平台开发,所以做了前期的调研,由于移动端工程内运用WebViewBridge做的JS交互,所以对flutter web的交互才能进行验证

调研

dart调用js

flutter供给了dart:js的包,运用该包可完结与js的交互,官方文档
(如果在工程中调用了import 'dart:js'无法打包成APP)

以调用js alert为例

js.context.callMethod("alert", [content]);

第一个参数为js办法名,后面一个为该办法的参数,这样就可以使alert弹出

dart调用WebviewBridge

那咱们现在知道了怎么调用js,依然无法调用WebviewBridge,因为WebviewBridge与原生交互是需求增加一个js办法的,所以咱们需求再写一个桥接文件,完结办法的注册,这样就可以调用WebviewBridge了

function setupWebViewJavascriptBridge(callback) {
    if (window.WebViewJavascriptBridge) {
       return callback(WebViewJavascriptBridge); 
    }
    if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
    window.WVJBCallbacks = [callback]; // 创建一个 WVJBCallbacks 大局属性数组,并将 callback 刺进到数组中。
    var WVJBIframe = document.createElement('iframe'); // 创建一个 iframe 元素
    WVJBIframe.style.display = 'none'; // 不显示
    WVJBIframe.src = 'https://__BRIDGE_LOADED__'; // 设置 iframe 的 src 属性
    document.documentElement.appendChild(WVJBIframe); // 把 iframe 增加到当前文导航上。
    setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
}
function webviewBridge(fun,data) {
  setupWebViewJavascriptBridge(function(bridge){
      if ( window.WebViewJavascriptBridge) {
        window.WebViewJavascriptBridge.callHandler(fun,{'data':data});
      }
  });
}
function webviewCallBackBridge(fun,callback,data) {
    setupWebViewJavascriptBridge(function(bridge){
        if ( window.WebViewJavascriptBridge) {
            window.WebViewJavascriptBridge.callHandler(fun,{'data':data},callback);
          }
    });
}
window.setupWebViewJavascriptBridge = setupWebViewJavascriptBridge;
window.webviewBridge = webviewBridge;
window.webviewCallBackBridge = webviewCallBackBridge;

在index.html中引证一下该js文件,这样dart就可以调用咱们封装的办法了
(在js中尽量不要运用es6的语法,在测试过程中有一部安卓手机内核版本较低,不支持es6导致无法成功调用)

详细完成

详细完成可以看见代码:git代码

写了一份代码完成,主要完成了dart调用js、dart调用原生、dart调用原生回来数据、原生调用dart、查看cookie功能