Flutter3.32 中使用 webview4.13 与 vue3 项目的 h5 页面通信,以及如何调试

随着App混合开发越来越多,如何与h5通信成为一个基础技能,根据最新的版本,实现一个 demo 和一份文档。

github 地址flutter 端(只实现了 android):github.com/SuiShanpu/h...

github 地址 h5 端:github.com/SuiShanpu/h...

一、准备工作

1、工具与版本

App 端开发环境

  • Flutter 3.32.5
  • Dart 3.8.1
  • webview_flutter 4.13.0

Web 端开发环境

  • node: 22.13.0
  • node: 10.9.2
  • vue 3.5.25
  • vite 7.2.4

开发工具:

  • App 端: Android Studio Narwhal 3 Feature Drop | 2025.1.3
  • Web 端: Visual Studio Code (1.106.3)

2、分别创建新的 App 项目和 Web 项目,并实现基本功能

Flutter 工程创建参考: 创建第一个 Flutter 项目

Vue3 工程创建参考: 创建一个 Vue 应用

App端: 可以从首页面 跳转到一个新的页面(WebviewPage)

Web端: 页面内包含2个按钮,点击后更改文本内容。

二、通信

webview 组件只能与要渲染 html 首页面进行通信;因为用的是 vue 组件,因此多了一层通信。

整个通信,用的是全局的 window 对象

1、vue组件 --> webview

在 vue 组件需要的地方触发,传递参数

js 复制代码
// 传递 string 格式
function onUseFlutter() {
  window.flutterBridge.postMessage('来自 h5 Home 页面的消息');
}

// 传递 json 格式
function onUseJsonFlutter() {
  window.jsonBridge.postMessage(
    JSON.stringify({ text: '来自 h5 Home 页面的消息' })
  );
}

在 webview 中注册事件,添加处理函数: 在 web 页面中就会注册一个 window.xxxx 对象。

dart 复制代码
// 与H5页面进行通信的桥梁
_webViewController.addJavaScriptChannel(
  // 会在H5的window上挂载一个FlutterBridge对象,该对象包含一个postMessage方法发送数据给flutter
  "flutterBridge",
  onMessageReceived: (JavaScriptMessage jsMsg) {
    // 根据 h5 传递的数据类型进行接收
    String message = jsMsg.message; 

    // todo something
  }
);

// 接收 json 对象数据
_webViewController.addJavaScriptChannel(
  // 会在H5的window上挂载一个FlutterBridge对象,该对象包含一个postMessage方法发送数据给flutter
  "jsonBridge",
  onMessageReceived: (JavaScriptMessage jsMsg) {
    // 如果是 json 对象,则需要使用 jsonDecode 解析
    Map<String, dynamic> message = jsonDecode(jsMsg.message);

    // todo something
  }
);

注意: 'flutterBridge' 名称是自定义的,需要对应一致。

2、webview --> html首页面

在 webview 中触发脚本

dart 复制代码
// 从flutter 发送信息
_sendFlutterTestMessage() async {
  // 构造要传递的参数(支持任意类型:对象、数组、字符串、数字等)
  final Map<String, dynamic> msgFlutter = {
    "msg": "这是 flutter 中的传递过来的值",
  };

  // 调用 h5 页面中脚本方法
  _webViewController.runJavaScript('''
    receiveFromFlutter(${jsonEncode(msgFlutter)});
  ''');
}

在 html 首页面中添加函数脚本

js 复制代码
function receiveFromFlutter(data) {
  console.log("receiveFromFlutter data:", data);
}

3、html首页面 --> vue组件

在 html 首页面中触发 window 自定义事件(定义自定义事件)

js 复制代码
function receiveFromFlutter(data) {
  // 创建自定义事件并携带数据
  const flutterEvent = new CustomEvent("flutter-to-home", { detail: data }); 
  // 触发事件
  window.dispatchEvent(flutterEvent); 
}

在 vue 组件需要的地方绑定 window 事件 (组件销毁时移除事件)

js 复制代码
onMounted(() => {
  window.addEventListener('flutter-to-home', useFlutterMessage);
});

onBeforeUnmount(() => {
  window.removeEventListener('flutter-to-home', useFlutterMessage);
});

function useFlutterMessage(ev) {
  const data = ev.detail;
  console.log("使用 fluter 中的值 data:", data);
}

3次通信都完成后,一个完整的通信完成,一次操作结束。

三、调试

使用 vConsole 插件。在 html首页面 添加如下脚本内容。

js 复制代码
<script src="https://cdn.bootcss.com/vConsole/3.3.0/vconsole.min.js"></script>
<script type="text/javascript">new VConsole();</script>

四、结语

与h5通信还有很多其他的内容,比如多语言、权限等。后面很有很长的路要走!

相关推荐
weixin_4080996716 分钟前
【完整教程】天诺脚本如何调用 OCR 文字识别 API?自动识别屏幕文字实战(附代码)
前端·人工智能·后端·ocr·api·天诺脚本·自动识别文字脚本
吴声子夜歌17 分钟前
ES6——Generator函数详解
前端·javascript·es6
吴声子夜歌18 分钟前
ES6——Set和Map详解
前端·javascript·es6
2301_8227032027 分钟前
鸿蒙flutter三方库实战——教育与学习平台:Flutter Markdown
学习·算法·flutter·华为·harmonyos·鸿蒙
码喽7号1 小时前
vue学习四:Axios网络请求
前端·vue.js·学习
粥里有勺糖1 小时前
视野修炼-技术周刊第129期 | 上一次古法编程是什么时候
前端·javascript·github
whuhewei2 小时前
JS获取CSS动画的旋转角度
前端·javascript·css
蓝黑20202 小时前
Vue组件通信之v-model
前端·javascript·vue
像素之间2 小时前
为什么运行时要加set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve
前端·javascript·vue.js
M ? A2 小时前
Vue转React实战:defineProps精准迁移实战
前端·javascript·vue.js·经验分享·react.js·开源·vureact