Flutter與Webview交互

項目中用到了webview_flutter這個插件肴楷,它允許我們在Flutter里面嵌套WebView辖众,同時我們也可以利用
addJavaScriptChannel方法來讓H5和我們交互闺兢。
但現(xiàn)在有一個問題就是赌蔑,addJavaScriptChannel可以讓h5單向給flutter發(fā)消息莫换,但如何在收到消息后回調(diào)h5呢乌奇?

我們可以利用runJavaScriptReturningResult方法來調(diào)用h5里面js的方法驶鹉,
例如

controller.runJavaScriptReturningResult(
            "window.JSBridgeCallback($id, '${json.encode(result)}')");

這段代碼的的意思就是執(zhí)行js中的

window.JSBridgeCallback = JSBridgeCallback;

const JSBridgeMap = {};
let callID = 0;

function JSBridgeCallback(id, params) {
    console.log("JSBridgeCallback", id, params);
    JSBridgeMap[id](params);
    JSBridgeMap[id] = null;
    delete JSBridgeMap[id];
}

方法。

接下來是具體步驟

  1. 在flutter里面,調(diào)用addJavaScriptChannel方法來在js的window對象上掛載一個對象
addJavaScriptChannel("Flutter", onMessageReceived: (message) {
        print("Flutter received: ${message.message}");

        final jsonObject = json.decode(message.message);
        final id = jsonObject['callID'];

        const result = {"version": 10};

        controller.runJavaScriptReturningResult(
            "window.JSBridgeCallback($id, '${json.encode(result)}')");
      })

我們需要h5告訴我們回調(diào)id子寓、方法名稱和參數(shù)

  1. 在H5項目中新建一個js文件暗挑,添加如下內(nèi)容
export function callFlutter(name, params, callback) {
    if (window.Flutter) {
        const id = callID++;
        const paramsObj = {
            method: name,
            callID: id,
            data: params || null
        }
        JSBridgeMap[id] = callback || ((result) => {
        });
        // JSBridgeHandle.call(method, JSON.stringify(paramsObj));
        window.Flutter.postMessage(JSON.stringify(paramsObj));
    }

}


window.JSBridgeCallback = JSBridgeCallback;

const JSBridgeMap = {};
let callID = 0;

function JSBridgeCallback(id, params) {
    console.log("JSBridgeCallback", id, params);
    JSBridgeMap[id](params);
    JSBridgeMap[id] = null;
    delete JSBridgeMap[id];
}

我們聲明一個JSBridgeCallback方法,并把它掛載到window上斜友,叫什么名字看你的喜好炸裆,不一定非要這個名字。
暴露callFlutter給外面調(diào)用鲜屏,callFlutter代碼的大致意思是
把回調(diào)函數(shù)保存到JSBridgeMap里面烹看,然后把方法id、參數(shù)和方法名稱打包成一個json通過window.Flutter.postMessage傳給flutter洛史。

  1. 在H5的一個按鈕上調(diào)用callFlutter方法惯殊,給flutter傳遞參數(shù)并拿到flutter的回調(diào),我這里用的框架是React
function App() {

    const [text, setText] = React.useState('Hello, Flutter!');


    return (
        <div className="App">
            <h1>{text}</h1>
            <button onClick={() => {
                callFlutter('getAppVersion', {method: 'showToast', args: ['Hello, Flutter!']}, (result: any) => {

                    // console.log("收到了來自Flutter的回調(diào): " + result);
                    setText(result);
                });
            }}>點我
            </button>
        </div>
    );
}

測試

我們在flutter里面的h5頁面點擊按鈕也殖,拿到了flutter傳來的結(jié)果并顯示


Screenshot_20231112-211205.png

flutter項目地址
React項目地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末土思,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子忆嗜,更是在濱河造成了極大的恐慌己儒,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捆毫,死亡現(xiàn)場離奇詭異闪湾,居然都是意外死亡,警方通過查閱死者的電腦和手機绩卤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門途样,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人濒憋,你說我怎么就攤上這事何暇。” “怎么了凛驮?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵裆站,是天一觀的道長。 經(jīng)常有香客問我辐烂,道長遏插,這世上最難降的妖魔是什么捂贿? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任纠修,我火速辦了婚禮,結(jié)果婚禮上厂僧,老公的妹妹穿的比我還像新娘扣草。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布辰妙。 她就那樣靜靜地躺著鹰祸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪密浑。 梳的紋絲不亂的頭發(fā)上蛙婴,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音尔破,去河邊找鬼街图。 笑死,一個胖子當(dāng)著我的面吹牛懒构,可吹牛的內(nèi)容都是我干的餐济。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼胆剧,長吁一口氣:“原來是場噩夢啊……” “哼絮姆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起秩霍,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤篙悯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后前域,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辕近,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年匿垄,在試婚紗的時候發(fā)現(xiàn)自己被綠了移宅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡椿疗,死狀恐怖漏峰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情届榄,我是刑警寧澤浅乔,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站铝条,受9級特大地震影響靖苇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜班缰,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一贤壁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧埠忘,春花似錦脾拆、人聲如沸馒索。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绰上。三九已至,卻和暖如春渠驼,著一層夾襖步出監(jiān)牢的瞬間蜈块,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工迷扇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疯趟,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓谋梭,卻偏偏與公主長得像信峻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瓮床,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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