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

Android端InAppWebView调用getContentHeight始终返回0的问题

Android端InAppWebView getContentHeight返回0的解决办法

问题原因

Android平台的getContentHeight()方法在onLoadStop回调触发时,网页DOM往往还没完全渲染结束,导致返回值为0;而iOS端的方法实现逻辑不同,能正确获取高度。

可行解决方案

  • 延迟获取高度
    给DOM渲染留一点时间,再调用获取高度的方法:
await Future.delayed(const Duration(milliseconds: 200));
final height = await controller.getContentHeight();

根据页面复杂度调整延迟时长,复杂页面可设为300-500ms。

  • 直接通过JS获取DOM高度
    绕过平台方法,直接注入JavaScript获取页面实际高度,兼容性更强:
final jsResult = await controller.evaluateJavascript(
  source: "Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)"
);
final height = double.tryParse(jsResult.toString()) ?? 0.0;

这种方式直接从网页DOM读取高度,两端都能稳定返回正确值。

  • 监听网页resize事件(适配动态内容)
    如果页面存在懒加载内容,onLoadStop后高度还会变化,可通过JS监听resize事件实时更新:
// 注册JS回调
controller.addJavaScriptHandler(
  handlerName: 'updateWebHeight',
  callback: (args) {
    if (args.isNotEmpty) {
      setState(() {
        webHeight = double.parse(args.first.toString());
      });
    }
  },
);

// 在onLoadStop中注入监听脚本
await controller.evaluateJavascript(source: '''
// 监听resize事件
window.addEventListener('resize', () => {
  window.flutter_inappwebview.callHandler('updateWebHeight', document.body.scrollHeight);
});
// 首次加载完成主动触发一次
window.flutter_inappwebview.callHandler('updateWebHeight', document.body.scrollHeight);
''');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:55:17