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
相关产品推荐
相关产品推荐

