Flutter js 相互(調(diào)用)通信

應(yīng)用場(chǎng)景:

在Flutter 中顯示一個(gè)網(wǎng)頁(yè)(H5之類)提完,然后在Flutter中可以調(diào)用網(wǎng)頁(yè)js里的方法百新; js里也可以調(diào)用 Flutter
中的方法珊燎。這樣就可以相互通信檬贰,方便一些功能的實(shí)現(xiàn)姑廉。

在Flutter中顯示一個(gè)網(wǎng)頁(yè)一般我們借助于官方提供的 webview_flutter 這個(gè)插件。

要想Flutter與js相互通信也是要借助于這個(gè)插件中的 JavascriptChannel翁涤。 我們也知道Flutter 在和android通信的時(shí)候是借助于MethodChannel桥言,這兩個(gè)蠻像的萌踱。

在說(shuō)具體的調(diào)用方法之前先說(shuō)一下WebView中幾個(gè)關(guān)鍵的方法
1)onWebViewCreated 這個(gè)方法在webView 創(chuàng)建完成時(shí)調(diào)用,只會(huì)被調(diào)用一次 号阿,返回的參數(shù)是WebViewController 并鸵。 后面我們Flutter調(diào)用js方法的時(shí)候就會(huì)用到這個(gè) WebViewController。
2)onPageFinished 這個(gè)方法在頁(yè)面加載完成時(shí)調(diào)用扔涧, 在里邊可以通過 WebViewController 來(lái)調(diào)用 js
調(diào)用方式 : _webViewController.evaluateJavascript("js 方法名").then((res){
// 這個(gè)res 是js方法的返回值
});

  1. Flutter中調(diào)用Js里定義的方法 (Flutter 調(diào) js )
    // 這個(gè)showMessage 是在js中定義的方法园担,這個(gè)方法的返回值是true
// _controller就是WebViewController 
_controller?.evaluateJavascript("showMessage('This message is from Flutter!')").then ((res)  {
  print ("evaluateJavascript-res: ${res}"); // evaluateJavascript-res: true 
});
  1. Js 中發(fā)消息給Flutter(js調(diào)Flutter )
    // 下面這段代碼是js中的一個(gè)方法
function sendMessage (message ) {
    // 這個(gè)MessageDeal是和Flutter里JavascriptChannel中的name一致的。
    // 不用自己確切的定義枯夜,只要Flutter和js里保持一樣就可以
    // 這里我最開始看這個(gè)的時(shí)候一直沒搞懂MessageDeal是什么弯汰,后來(lái)敲了一遍代碼終于明白了, 
    // 這個(gè)其實(shí)和MethodChannle中的channel字符串有類似的意思湖雹,唯一標(biāo)識(shí)
    MessageDeal.postMessage(message);  // 關(guān)鍵
    document.getElementById ("content2").innerHTML = message;
} 

完整的代碼 :
js端:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>html demo</title>
</head>
<body>
<script>

<!--        這個(gè)方法是用來(lái)給Flutter調(diào)用的(即:Flutter調(diào)用js方法)-->
        function showMessage (message){
            document.getElementById ("content").innerHTML = message;
            return true;
        }

<!--        這個(gè)方法是用來(lái)發(fā)送一個(gè)消息給Flutter的(即:js調(diào)用Flutter方法)-->
        function sendMessage (message ) {
            MessageDeal.postMessage(message);
            document.getElementById ("content2").innerHTML = message;
        }

</script>
<div id="content"><span>Flutter發(fā)送過來(lái)的消息是: </span>test</div>
<div id="content2"><span>我發(fā)送給Flutter的消息是:</span>test2</div>

<button onclick="sendMessage('我來(lái)自js調(diào)用sendMessage蝙泼,我調(diào)用了Flutter中的功能')">send a message to Flutter</button>

</body>
</html>

Flutter端:
在本地測(cè)試的時(shí)候, 可以用上邊的Html文件劝枣,然后用http-server在html文件所在目錄開啟一個(gè)本地的服務(wù),這樣就可以通過http://你的ip:8080/demo.html來(lái)訪問你的html文件來(lái)測(cè)試了织鲸。 沒有http-server這個(gè)的可以去安裝一下舔腾,用這個(gè)還是還方便的。 【安裝http-server: npm i http-server -g 】

 WebView(
  key: key,
  javascriptMode: JavascriptMode.unrestricted,
  initialUrl: url, // 網(wǎng)頁(yè)地址: "http://172.18.230.138:8080/demo.html";
  onWebViewCreated: (controller) {
    _controller = controller;
  },
  navigationDelegate: (NavigationRequest request) {
    var url = request.url;  
    setState(() {
      isLoading = true; // 開始訪問頁(yè)面搂擦,更新狀態(tài)
    });
    return NavigationDecision.navigate;
  },
  onPageFinished: (url) { 
    _controller?.evaluateJavascript("showMessage('This message is from Flutter!')").then ((res)  {
      print ("evaluateJavascript-res: ${res}");
    }); 
  },
  javascriptChannels: <JavascriptChannel>[
    JavascriptChannel(
        name: "MessageDeal",
        onMessageReceived: (JavascriptMessage message) {
          // 這里接收到的就是 js 中發(fā)送過來(lái)的message稳诚。 和js里MessageDeal.postMessage(message) 中的message 對(duì)應(yīng) 。
          // 可以根據(jù)message來(lái)做一些相應(yīng)的處理 
          print("${message.toString()},  ${message.hashCode}, message: ${message.message}") ;
          // 收到消息后回復(fù)一個(gè)消息給js那邊
          _controller?.evaluateJavascript("showMessage ('我(Flutter)收到了你的消息[${message.message}].)");
        }),
  ].toSet(),
)

如上瀑踢, 簡(jiǎn)單的js發(fā)消息給flutter , flutter調(diào)js方法就說(shuō)完了 扳还。 僅記錄學(xué)習(xí)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末橱夭,一起剝皮案震驚了整個(gè)濱河市氨距,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棘劣,老刑警劉巖俏让,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異茬暇,居然都是意外死亡首昔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門糙俗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)勒奇,“玉大人,你說(shuō)我怎么就攤上這事巧骚∩薜撸” “怎么了格二?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)巨税。 經(jīng)常有香客問我蟋定,道長(zhǎng),這世上最難降的妖魔是什么草添? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任驶兜,我火速辦了婚禮,結(jié)果婚禮上远寸,老公的妹妹穿的比我還像新娘抄淑。我一直安慰自己,他們只是感情好驰后,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布肆资。 她就那樣靜靜地躺著,像睡著了一般灶芝。 火紅的嫁衣襯著肌膚如雪郑原。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天夜涕,我揣著相機(jī)與錄音犯犁,去河邊找鬼。 笑死女器,一個(gè)胖子當(dāng)著我的面吹牛酸役,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驾胆,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼涣澡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了丧诺?” 一聲冷哼從身側(cè)響起入桂,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎驳阎,沒想到半個(gè)月后事格,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搞隐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年驹愚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劣纲。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逢捺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出癞季,到底是詐尸還是另有隱情劫瞳,我是刑警寧澤倘潜,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站志于,受9級(jí)特大地震影響涮因,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伺绽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一养泡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奈应,春花似錦澜掩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至惩妇,卻和暖如春株汉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歌殃。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工乔妈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挺份。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像贮懈,于是被迫代替她去往敵國(guó)和親匀泊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容