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

Flutter中如何向WebView加载的assets资源文件传递参数

为什么你的现有实现无法生效

  • 直接在initialFile路径后拼接query参数不生效:加载本地assets文件时,系统会将完整路径作为文件名匹配资源,assets/index.html?name=foo&lastname=Bar本身不是存在的资源文件,因此无法加载。
  • 构造POST请求传body不生效:本地file协议的静态资源没有服务端处理请求逻辑,WebView加载本地文件时会直接忽略请求body,参数无法传递到页面。

可行的实现方案

方案1:页面加载完成后JS注入传参(最常用,适配绝大多数场景)

等WebView加载完assets页面后,调用JS注入接口把参数挂载到页面全局对象,或者直接调用页面的参数接收方法。
Flutter端代码示例:

return Container(
  child: InAppWebView(
    initialFile: "assets/index.html",
    initialOptions: inAppWebViewGroupOptions,
    onPageFinished: (controller, url) async {
      // 注入参数到页面全局对象
      await controller.evaluateJavascript(source: '''
        window.passParams = {
          name: "foo",
          lastname: "Bar"
        };
        // 若页面有预设的参数接收函数,可直接调用
        // handleParams(window.passParams);
      ''');
    },
  ),
);

前端页面(index.html)取值示例:

window.onload = function() {
  const params = window.passParams;
  console.log(params.name); // 输出 foo
  console.log(params.lastname); // 输出 Bar
}

方案2:拼接HTML内容加载(适合参数需要页面初始化时就获取的场景)

先读取assets下的HTML文件内容,把参数提前注入到HTML的JS代码中,再加载拼接后的内容,注意设置baseUrl保证页面内相对路径的静态资源正常加载。
Flutter端代码示例:

// 提前读取assets的HTML内容
String htmlContent = await rootBundle.loadString('assets/index.html');
// 拼接参数注入代码
String injectScript = '''
<script>
window.passParams = {
  name: "foo",
  lastname: "Bar"
};
</script>
''';
// 将注入代码插入到head标签结束前
htmlContent = htmlContent.replaceFirst('</head>', '$injectScript</head>');

return Container(
  child: InAppWebView(
    initialOptions: inAppWebViewGroupOptions,
    initialData: InAppWebViewInitialData(
      data: htmlContent,
      baseUrl: Uri.parse("file:///assets/"), // 必须设置,否则页面内相对路径资源加载失败
    ),
  ),
);

方案3:本地服务中转(适合复杂传参/模拟服务端请求场景)

在APP内启动一个本地轻量HTTP服务,将assets目录映射为服务的静态资源目录,WebView直接请求本地服务的地址,此时可以正常携带query参数,本地服务拿到参数后返回对应内容即可。该方案复杂度较高,非必要不推荐使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:54:04