You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Web环境下WebView如何添加JavaScript通信通道?

在Flutter Web的WebView中实现JavaScript通道通信的方案

由于webview_flutter_web并未实现addJavaScriptChannel方法,你可以通过以下几种Web原生的交互方式来替代实现Flutter与HTML/JS的通信:

方案一:使用dart:js直接绑定全局函数

通过Flutter的dart:js包,直接在全局JS上下文注册可调用的Flutter方法,同时也能调用HTML中的JS函数,实现双向通信。

Flutter端代码

import 'dart:js' as js;

// 注册供JS调用的Flutter方法
void registerJsCallback() {
  // 给全局window对象挂载flutterChannel方法
  js.context['flutterChannel'] = (String message) {
    // 处理JS传递的消息
    print('JS传来的消息:$message');
    // 可在这里执行Flutter端逻辑
  };
}

// 调用HTML中的JS方法
void invokeJsFunction(String message) {
  // 调用HTML里定义的jsReceiveMessage函数
  js.context.callMethod('jsReceiveMessage', [message]);
}

HTML端代码

<script>
// 向Flutter发送消息
function sendToFlutter(message) {
  // 检查全局方法是否存在,避免报错
  if (window.flutterChannel) {
    window.flutterChannel(message);
  }
}

// 供Flutter调用的JS方法
function jsReceiveMessage(message) {
  console.log('Flutter传来的消息:' + message);
  // 执行JS端逻辑
}
</script>

方案二:使用HTML5 postMessage 跨上下文通信

如果你的WebView底层是iframe实现(webview_flutter_web默认如此),可以利用HTML5的postMessage API实现跨窗口通信,这种方式更安全,支持跨域验证。

Flutter端代码

import 'dart:html' as html;
import 'dart:js' as js;

// 监听HTML发来的message事件
void setupMessageListener() {
  html.window.addEventListener('message', (html.Event event) {
    final messageEvent = event as html.MessageEvent;
    // 验证消息来源,防止恶意通信
    if (messageEvent.origin == 'http://localhost:8080') { // 替换为你的HTML文件地址
      print('通过postMessage收到消息:${messageEvent.data}');
      // 回复消息给HTML
      (messageEvent.source as html.Window?)?.postMessage('已收到消息', messageEvent.origin);
    }
  });
}

// 向HTML发送消息
void sendMessageToHtml(String message) {
  // 获取webview对应的iframe元素(需确认webview_flutter_web生成的iframe id,可通过浏览器调试查看)
  final iframe = html.document.querySelector('iframe') as html.IFrameElement?;
  iframe?.contentWindow?.postMessage(message, 'http://localhost:8080'); // 替换为HTML地址
}

HTML端代码

<script>
// 向Flutter发送消息
function sendToFlutter(message) {
  // 发送消息给父窗口(Flutter Web)
  window.parent.postMessage(message, 'http://localhost:5000'); // 替换为Flutter Web的运行地址
}

// 监听Flutter发来的消息
window.addEventListener('message', (event) => {
  if (event.origin === 'http://localhost:5000') { // 替换为Flutter Web地址
    console.log('Flutter传来的消息:' + event.data);
  }
});
</script>

方案三:使用支持JS通信的替代WebView包

可以选择flutter_inappwebview这类跨平台WebView包,它的Web端实现完整支持JavaScript通道、postMessage等通信能力,配置后能和移动端保持一致的调用方式,但需要额外引入依赖并适配配置。


内容的提问来源于stack exchange,提问作者ssindher11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:48:16