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)
}
相关推荐
恋猫de小郭12 小时前
Flutter A2UI 的正确用法,怎么把 AI 和动态 UI 结合有效生产
android·前端·flutter
界面开发小八哥13 小时前
界面控件DevExpress Blazor v26.1新版亮点 - TreeList & 数据编辑器
javascript·编辑器·.net·界面控件·blazor·devexpress·用户界面
风月说与山鬼13 小时前
二、uni-app入口文件(main.js)
javascript·uni-app
zhanghaha131413 小时前
HTML系列教程:4_什么是 HTML 元素(零基础超详细讲解)
前端·算法·html
AI 编程助手GPT14 小时前
VS Code 1.133 实战:Claude 可免 GitHub 登录,HTML 保存后自动刷新
前端·html·github
年小个大18 小时前
受 go-zero 启发,我给 Flutter 整了套 MVI-BLoC 脚手架
android·flutter·架构
mCell1 天前
Lua 编程入门:从基础语法到元表
javascript·算法·lua
伟大的兔神1 天前
我做了一个本地优先的 AI 图片工作台:Loomora v1.0.0 正式发布
前端·javascript·vue.js
fangzhanpeng1681 天前
(前端)2.js变量作用域样例
开发语言·前端·javascript
码艺-Alimjan1 天前
Vue项目源码备份最佳实践:无视node_modules,打包体积仅2MB
前端·javascript·vue.js