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

Flutter跨域下flutter_inappwebview向JS传参的跨平台方案问询

跨平台Flutter向WebView的JS函数传递数据解决方案

方案1:使用JavaScript Handler双向通信(推荐)

这是flutter_inappwebview官方支持的全平台通信方案,Web平台通过postMessage实现,避开同源策略限制,兼容性拉满。

实现步骤

Flutter端注册Handler(让JS主动获取数据)

webViewController.addJavaScriptHandler(
  handlerName: 'getCmpData',
  callback: (args) {
    // 返回需要传递给JS的数据
    return {'userId': '123', 'preferences': {'ads': true}};
  },
);

JS端调用Handler并触发目标函数

window.addEventListener('load', async () => {
  // 调用Flutter注册的Handler获取数据
  const cmpData = await window.flutter_inappwebview.callHandler('getCmpData');
  // 触发你的receivecmpdata函数
  receivecmpdata(cmpData);
});

(可选)Flutter主动触发JS函数

如果需要Flutter主动推送数据,可让JS先注册接收Handler:
JS端:

window.flutter_inappwebview.addHandler('receiveCmpData', (dataStr) => {
  const cmpData = JSON.parse(dataStr);
  receivecmpdata(cmpData);
  return Promise.resolve(true);
});

Flutter端:

final yourData = {'key': 'value'};
await webViewController.callAsyncJavaScript(
  functionBody: '''
    window.flutter_inappwebview.callHandler('receiveCmpData', JSON.stringify(${jsonEncode(yourData)}));
  ''',
);

方案2:通过URL参数传递数据

适合数据量较小的场景,直接把数据编码后拼在加载URL的查询参数中,JS解析后调用目标函数。

实现步骤

Flutter端构造带参数的URL

import 'dart:convert';

// 把数据转成JSON并编码,避免特殊字符问题
final encodedData = Uri.encodeComponent(jsonEncode({'key': 'value'}));
final targetUrl = Uri.parse('http://your-html-page.com?cmpData=$encodedData');
webViewController.loadUrl(urlRequest: URLRequest(url: targetUrl));

JS端解析URL参数并触发函数

window.addEventListener('load', () => {
  const urlParams = new URLSearchParams(window.location.search);
  const cmpDataStr = urlParams.get('cmpData');
  if (cmpDataStr) {
    const cmpData = JSON.parse(decodeURIComponent(cmpDataStr));
    receivecmpdata(cmpData);
  }
});

方案3:注入UserScript初始化数据

直接在页面加载阶段注入包含数据的JS代码,无需跨域通信,全平台支持。

实现步骤

Flutter端注入UserScript

import 'dart:convert';

final userScript = UserScript(
  source: '''
    window.addEventListener('DOMContentLoaded', () => {
      // 直接将数据注入到JS环境
      const cmpData = ${jsonEncode({'key': 'value'})};
      receivecmpdata(cmpData);
    });
  ''',
  // 确保在DOM加载完成后注入
  injectionTime: InjectionTime.DOM_CONTENT_LOADED,
);
webViewController.addUserScript(userScript);

// 加载目标HTML页面
webViewController.loadUrl(urlRequest: URLRequest(url: Uri.parse('http://your-html-page.com')));

原方案失效原因说明

  • evaluateJavascript在Web平台无效:Web平台下flutter_inappwebview基于iframe实现,跨域场景下调用该方法会被浏览器同源策略拦截,而Windows平台WebView无此限制。
  • Cookie传递出现跨域错误:浏览器同源策略禁止不同域页面访问Cookie,同时第三方资源请求(如Kaspersky的接口)未配置CORS头,被浏览器安全机制拦截。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:35:13