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

Flutter WebView JS Channel在Android设备上失效问题求助

解决Flutter WebView Android端JS Channel无法接收消息的问题

针对你遇到的iOS正常、Android无法接收JS Channel消息的问题,结合webview_flutter的特性,提供以下几个排查和解决方向:

1. 调整JS Channel注册与页面加载的顺序

当前代码先调用loadHtmlString再注册JS Channel,可能导致页面加载完成后JS执行时,Channel还未完成注册。Android WebView对注册时机敏感度更高,建议先完成所有Channel配置,再加载页面:

final WebViewController controller = WebViewController.fromPlatformCreationParams(params);

controller
  ..setJavaScriptMode(JavaScriptMode.unrestricted)
  ..setBackgroundColor(const Color(0x00000000))
  // 先注册JS Channel
  ..addJavaScriptChannel(
    'Print',
    onMessageReceived: (JavaScriptMessage result) {
      try {
        final json = result.message.replaceAll('message: craftgateResponse,', '"message": "craftgateResponse",').replaceAll('value', '"value"');
        final data = jsonDecode(json) as Map<String, dynamic>;
        AppCore.pop(
          context: context,
          pop: CreditCardPaymentResponse.fromJson(data),
        );
      } catch (e) {
        // 添加错误捕获,排查解析问题
        print('JSON解析失败: $e, 原始消息: ${result.message}');
      }
    },
  )
  // 再加载页面
  ..loadHtmlString(html ?? "");

2. 验证JS调用的Channel名称大小写

Android WebView对JS Channel的名称大小写敏感,而iOS可能存在兼容。确保网页中的JS代码调用的Channel名称与你注册的完全一致:
比如你注册的是Print,JS代码必须写:

window.Print.postMessage(yourJsonData);

如果JS里写成小写的print,Android端会无法找到对应的Channel。

3. 配置Android WebView的必要设置

Android WebView默认有一些限制,需要手动开启相关权限或功能:

if (controller.platform is AndroidWebViewController) {
  AndroidWebViewController.enableDebugging(true);
  final androidController = controller.platform as AndroidWebViewController;
  androidController.setMediaPlaybackRequiresUserGesture(false);
  // 开启DOM存储,部分页面依赖此功能保存状态
  androidController.getSettings().then((settings) {
    settings.setDomStorageEnabled(true);
    // 允许JS自动打开窗口(如果3D验证页面有跳转需求)
    settings.setJavaScriptCanOpenWindowsAutomatically(true);
    // 允许跨域资源访问(如果页面存在跨域请求)
    settings.setAllowUniversalAccessFromFileURLs(true);
  });
}

4. 调试JS执行状态

利用Android WebView的调试功能,在Chrome浏览器中输入chrome://inspect,找到对应的WebView实例,查看Console面板:

  • 检查JS是否有报错(比如window.Print未定义)
  • 确认postMessage是否被执行
  • 查看发送的消息内容是否符合预期,是否存在格式错误

5. 排查JSON解析异常

你的代码中对消息做了字符串替换来修复JSON格式,可能Android端返回的原始消息格式与iOS不同,导致解析失败。添加try-catch捕获解析异常,打印原始消息内容,确认是否是解析问题导致的逻辑中断(而非未收到消息)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:52:49