Flutter中,html 与 dart 桥接沟通

  • flutter_inappwebview

webview_flutter

dart 调用 html 方法

dart

其实就是dart向html发送消息,使用webViewController.runJavaScript方法,执行一段js脚本。

复制代码
// 使用 postMessage 发送
webViewController.runJavaScript('''
window.postMessage($message, '*');
''');

若为map,需要先转换为json字符串,避免引号冲突。

html

复制代码
const handleMessage = (event: MessageEvent) => {
const data = event.data
// 解析消息内容...
}

// 添加窗口消息监听器
window.addEventListener('message', handleMessage)

html 调用 dart 方法

dart

通过JavaScriptChannel,来实现监听html发送的消息的功能。

先向页面添加 JavaScriptChannel

复制代码
//添加 JavaScript 通道用于接收 H5 消息
webViewController.addJavaScriptChannel('FlutterChannel',
onMessageReceived: (JavaScriptMessage message) {
handleH5Message(message.message); // 这就是处理html发送的消息的方法
});

html

这里的 FlutterChannel 是在dart端通过addJavaScriptChannel方法添加的,在网页端不需要声明。

复制代码
// 使用 FlutterChannel 通道发送消息(匹配 Flutter 端的 JavaScriptChannel)
try {
if ((window as any).FlutterChannel) {
(window as any).FlutterChannel.postMessage(JSON.stringify(message))
console.log('通过 FlutterChannel 发送消息到 Flutter:', message)
} else {
console.warn('FlutterChannel 未定义,无法发送消息到 Flutter')
}
} catch (error) {
console.error('发送到 Flutter 失败:', error)
}

flutter_inappwebview

dart 调用 html 方法

dart

其实就是dart向html发送消息,使用webViewController.evaluateJavascript方法,执行一段js脚本。

复制代码
// 使用 postMessage 发送
webViewController?.evaluateJavascript(
source: "window.postMessage($value, '*');",
);

若为map,需要先转换为json字符串,避免引号冲突。

html

复制代码
const handleMessage = (event: MessageEvent) => {
const data = event.data
// 解析消息内容...
}

// 添加窗口消息监听器
window.addEventListener('message', handleMessage)

html 调用 dart 方法

dart

通过JavaScriptChannel,来实现监听html发送的消息的功能。

先向页面添加 JavaScriptChannel

复制代码
// 添加 JavaScript Handler 用于接收 H5 消息
webViewController!.addJavaScriptHandler(
handlerName: 'FlutterChannel', // <--- 这个需要和 html 中的 handlerName 一致
callback: (message) {
if (message.isEmpty) {
return;
}
handleH5Message(message[0]);
},
);

html

这里的 FlutterChannel 是在dart端通过addJavaScriptChannel方法添加的,在网页端不需要声明。

复制代码
// 使用 flutter_inappwebview 通道发送消息(匹配 Flutter 端的 JavaScriptChannel)
try {
if ((window as any).flutter_inappwebview) {
// 调用 Dart 端的 handlerName 并发送数据
(window as any).flutter_inappwebview.callHandler('FlutterChannel', message)
console.log('use flutter_inappwebview send to Flutter:', message)
} else {
console.warn('flutter_inappwebview undefine')
}
} catch (error) {
console.error('Send to Flutter failed: ', error)
}
相关推荐
前端精髓20 分钟前
React 更新 state 中的对象
javascript·react.js·ecmascript
可乐鸡翅yeah_1 小时前
hls.js 播放质量埋点实战,采集卡顿、起播、错误指标定位线上用户问题
开发语言·前端·javascript·ecmascript·音视频·m3u8·音视频在线播放
Bs_MoneyMagnet3 小时前
基于springboot+vue的宠物殡葬管理平台的设计与实现 源码+文档
java·javascript·vue.js·spring boot·后端·宠物
尾善爱看海4 小时前
Vue 面试进阶篇:Composition API、插槽、自定义指令……8 个章节 + 高频面试题全解析
前端·javascript·vue.js·面试·vue
天空之城--5 小时前
Flutter UI 绘制原理浅析
flutter
三小河5 小时前
在 Codex 桌面端接入 DeepSeek 模型(CC Switch 代理中转)
前端·javascript·人工智能
shmily麻瓜小菜鸡5 小时前
JS/TS 易踩坑知识点 — 自动分号插入(ASI)
开发语言·javascript·ecmascript
CoderYanger5 小时前
前端基础——JavaScript(WebAPI)代码案例
java·开发语言·前端·javascript·css·前端框架·html5
BillKu6 小时前
Element Plus 的 el-tab-pane:lazy 的说明
前端·javascript·vue.js
farerboy6 小时前
编程技巧:VUE 实现接口返回数据的流式处理
javascript·vue.js