HarmonyOS鸿蒙Next中使用的flutter_inappwebview OHOS fork (br_v6.1.5_ohos) 没有正确实现 InAppWebViewKeepAlive。当页面从路由栈弹出时,原生 WebView 实例在鸿蒙上被销毁
HarmonyOS鸿蒙Next中使用的flutter_inappwebview OHOS fork (br_v6.1.5_ohos) 没有正确实现 InAppWebViewKeepAlive。当页面从路由栈弹出时,原生 WebView 实例在鸿蒙上被销毁 【问题描述】:鸿蒙版使用的 flutter_inappwebview OHOS fork (br_v6.1.5_ohos) 没有正确实现 InAppWebViewKeepAlive。当页面从路由栈弹出时,原生 WebView 实例在鸿蒙上被销毁,即使 Dart 侧 widget 被静态变量缓存。Android/iOS的原生实现正确支持了 keep-alive。鸿蒙版本每次进入webview都会重新加载,没有保持之前的状态,Android和iOS都正常
【问题现象】:鸿蒙版使用的 flutter_inappwebview OHOS fork (br_v6.1.5_ohos) 没有正确实现 InAppWebViewKeepAlive。当页面从路由栈弹出时,原生 WebView 实例在鸿蒙上被销毁
【版本信息】: HarmonyOS NEXT; Flutter ohos; flutter_inappwebview OHOS fork (br_v6.1.5_ohos)
【复现代码】:插件链接: https://gitcode.com/openharmony-sig/flutter_inappwebview/tree/br_v6.1.5_ohos
【尝试解决方案】:无
更多关于HarmonyOS鸿蒙Next中使用的flutter_inappwebview OHOS fork (br_v6.1.5_ohos) 没有正确实现 InAppWebViewKeepAlive。当页面从路由栈弹出时,原生 WebView 实例在鸿蒙上被销毁的实战教程也可以访问 https://www.itying.com/category-92-b0.html
开发者您好,根据您目前提供的信息无法复现问题,为了后续更好地分析解决问题,麻烦您提供一份完整可复现问题的最小化demo,感谢您的支持和配合。
更多关于HarmonyOS鸿蒙Next中使用的flutter_inappwebview OHOS fork (br_v6.1.5_ohos) 没有正确实现 InAppWebViewKeepAlive。当页面从路由栈弹出时,原生 WebView 实例在鸿蒙上被销毁的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
不想改源码。先弄个全局webView,不销毁将就下。等新版本修复吧。
这个问题其实不是你用法的问题,大概率是:
flutter_inappwebview 的 OHOS fork 本身没有完整实现 keepAlive 生命周期。
你观察到的现象:
页面 pop 后 WebView 被销毁
再次进入重新创建
说明:
真正被销毁的是:
OHOS 原生侧 PlatformView
而不是 Dart Widget。
这也是为什么:
即使 Dart static 缓存了 widget
依然会重新加载。
因为:
缓存的只是 Dart 对象
不是原生 ArkWeb 实例
——————————
你这里核心问题本质上是:
OHOS PlatformView 生命周期实现不完整
不是:
InAppWebViewKeepAlive API 本身失效
——————————
为什么 Android/iOS 正常?
因为:
Android/iOS 官方实现里:
InAppWebViewKeepAlive
本质会:
- 缓存 native webview
- 复用 platform view
- 阻止 dispose
- detach 而非 destroy
例如 Android:
通常会:
removeView()
而不是:
destroy()
iOS 类似。
所以:
WebView 内核实例实际上还活着。
——————————
但:
OHOS fork 很可能只是:
Dart层兼容了 API
并没有真正实现:
native keep alive
所以:
路由 pop 时:
ArkWeb 被真正销毁。
——————————
你现在这个现象非常符合:
OHOS fork 当前状态:
只是"功能能跑"
但生命周期还没完全对齐 Android/iOS
这在目前 Flutter OHOS 生态里其实很常见。
尤其:
- PlatformView
- Texture
- Surface
- 生命周期
很多都还没完全成熟。
——————————
你现在可以自己验证:
在:
OHOS 原生侧
搜索:
dispose
onDispose
destroy
aboutToDisappear
大概率会发现:
页面 pop 时:
直接:
controller.dispose()
或者:
webviewController.destroy()
了。
——————————
真正的问题点:
大概率在:
FlutterPlatformViewFactory
或者:
OHOSWebViewController
生命周期里。
——————————
而:
InAppWebViewKeepAlive
在 Android/iOS 的实现逻辑:
其实不仅仅是:
static widget
而是:
native instance cache
OHOS fork 很可能缺了这一层。
——————————
你现在有几个现实方案:
方案1(推荐)
不要 pop 页面。
改成:
Offstage / IndexedStack
保活。
例如:
IndexedStack(
index: currentIndex,
children: [
WebPage(),
OtherPage(),
],
)
这样:
WebView 页面不会真正销毁。
这是目前 Flutter OHOS 最稳方案。
——————————
方案2
使用:
AutomaticKeepAliveClientMixin
但:
我估计你已经试过了。
而且:
它只能保 Dart Widget。
不能保:
OHOS native webview instance
所以:
大概率无效。
——————————
方案3(真正修插件)
需要改:
OHOS fork native实现
核心思路:
不要在:
dispose
时真正 destroy ArkWeb。
而是:
detach + cache
类似 Android/iOS 实现。
但这个改动会比较大。
——————————
你需要重点研究:
插件 OHOS 部分:
PlatformView 生命周期
尤其:
- onDispose
- onDetachedFromWindow
- aboutToDisappear
- WebviewController.destroy
——————————
方案4(临时折中)
退出前:
保存:
- url
- scroll position
- history
- form state
回来时恢复。
虽然不是真 keepAlive,
但用户体验会好很多。
——————————
还有一个 HarmonyOS 特有问题:
ArkWeb 本身资源回收策略比 Android 激进。
即使你不 destroy,
HarmonyOS 有时也会:
主动释放后台页面资源
尤其:
- 内存紧张
- 页面切后台
- Stage切换
所以:
即使未来插件支持 keepAlive,
也未必能完全等同 Android。
——————————
最后总结一下:
你这个问题:
大概率不是:
flutter_inappwebview 用法错误
而是:
OHOS fork 尚未完整实现 native keep alive 生命周期
本质问题:
ArkWeb 原生实例在页面 pop 时被 destroy
当前最现实解决方案:
IndexedStack / Offstage 保活页面
不要真正 pop WebView 页面。
学习。
在鸿蒙Next中,flutter_inappwebview OHOS fork (br_v6.1.5_ohos) 的 InAppWebViewKeepAlive 未正确实现,原因是该版本未适配鸿蒙的组件生命周期管理。当页面从路由栈弹出时,Flutter引擎会销毁对应Widget,但KeepAlive机制未在鸿蒙上持有原生WebView实例,导致其随Widget被系统回收。需检查该fork中KeepAlive组件的dispose逻辑,确保不释放WebView引用。
该问题源于 flutter_inappwebview OHOS fork 在鸿蒙平台未适配 InAppWebViewKeepAlive 的完整逻辑。
Android/iOS 端通过保持原生 webView 引用并对 Flutter 层维护实例不被 GC,当页面出栈时 widget 缓存但平台视图仍存活。
而当前 OHOS 分支中,InAppWebViewKeepAlive 实现缺失,系统在页面从路由栈移除时直接销毁原生组件,Dart 层的静态变量缓存无法阻止平台侧回收,导致每次重新进入都触发新加载。
修复需在鸿蒙平台层对齐 InAppWebViewKeepAlive 机制:在页面关闭时保留原生 webView 实例,并在重新 attach 时复用,而不是重建。


