Flutter與H5網頁交互總結

本文使用的是Flutter官方的webview_flutter組件,對Flutter與h5常用交互進行總結。

一、JS向Flutter傳遞數據

1、通過URL方式

H5代碼如下,傳遞參數key是“name”,值是camera。

   btn.addEventListener('click', function () {
        //通過URL向flutter傳遞參數
        document.location = "cwq://webview?name=camera";
   }, false)

Flutter代碼如下,通過解析url,取出name對應的值。

  controller = WebViewController()
      //開啟JS執(zhí)行
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..setNavigationDelegate(
         NavigationDelegate(onNavigationRequest: (NavigationRequest request) {
        //約定一個通信協(xié)議 cwq://webview
        if (request.url.startsWith("cwq://webview")) {
          debugPrint('處理JS通過URL傳遞過來的數據: $request');
          Uri uri = Uri.parse(request.url);
          //解析數據
          var name = uri.queryParameters['name'];
          debugPrint('name:$name');
          ScaffoldMessenger.of(context)
              .showSnackBar(SnackBar(content: Text('name:$name')));
          return NavigationDecision.prevent; //不跳轉;
        }
        debugPrint('非cwq://webview開頭的URL則放行 $request');
        return NavigationDecision.navigate;
      }));

2、通過JavaScriptChannels方式

H5代碼如下,傳遞參數key是“updateDevice”,值是id123456。

 btn.addEventListener('click', function () {
     //通過注冊的updateDevice channel向flutter發(fā)送消息
     updateDevice.postMessage("id123456");
 }, false)

Flutter代碼如下,通過監(jiān)聽updateDevice Channel,取出對應的值。

controller = WebViewController()
      //開啟JS執(zhí)行
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..addJavaScriptChannel('updateDevice',
          onMessageReceived: (JavaScriptMessage message) {
        ScaffoldMessenger.of(context)
            .showSnackBar(SnackBar(content: Text(message.message)));
       });

一、Flutter 向JS傳遞數據

1、通過URL方式

Flutter代碼,在加載的url后面添加參數即可,如:

controller.loadRequest(Uri.parse(
            'https://www.cwq.com/devices/Flutter2JSByUrl.html?name=device123'));

2、通過runJavaScript方式

Flutter代碼,runJavaScript調用cwqCallJs、cwqCallJsWithResult

var name = 'wqdev';
controller.runJavaScript("cwqCallJs('$name')"); //這里$name前后需要帶'',否則格式檢測不通過
var result = await controller.runJavaScriptReturningResult("cwqCallJsWithResult(2,2)");
debugPrint('來在JS的計算結果:$result');

H5代碼

<script type="text/javascript">
    function cwqCallJs(msg) {
       document.getElementById('resultTxt').innerHTML = 'Flutter傳遞過來的數據:' + msg;
    }
    function cwqCallJsWithResult(v1, v2) {
      return parseInt(v1) + parseInt(v2);
    }
</script>
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容