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

7 回复

开发者您好,根据您目前提供的信息无法复现问题,为了后续更好地分析解决问题,麻烦您提供一份完整可复现问题的最小化demo,感谢您的支持和配合。

更多关于HarmonyOS鸿蒙Next中使用的flutter_inappwebview OHOS fork (br_v6.1.5_ohos) 没有正确实现 InAppWebViewKeepAlive。当页面从路由栈弹出时,原生 WebView 实例在鸿蒙上被销毁的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


这个更像 OHOS fork 的原生侧生命周期没有完整实现 keepAlive。Dart 侧缓存 widget 只能保住 Dart 对象,保不住已经随路由 pop 销毁的原生 ArkWeb/PlatformView 实例,所以再次进入会重新加载。

可先确认 pop 时 OHOS 原生侧是否触发 aboutToDisappear/aboutToBeDeleted 或 dispose;如果触发了 destroy,就说明 keepAlive 没真正落到原生 WebView 实例复用。临时方案是把 WebView 放在更上层页面,用 Stack、Visibility、IndexedStack 或自建页面容器保持组件不出树;长期方案需要 patch 插件 ohos 侧,做 WebView/Controller 实例池,路由切换时 detach/隐藏,明确释放时再 destroy。

不想改源码。先弄个全局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 时复用,而不是重建。

回到顶部