月影银翔
月影银翔
  • 发布:2026-06-30 15:31
  • 更新:2026-06-30 15:31
  • 阅读:31

【报Bug】App端 web-view 内部存在多级历史时,强行关闭页面会导致路由死锁及 TypeError 崩溃

分类:鸿蒙Next

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 11

HBuilderX类型: 正式

HBuilderX版本号: 5.07

手机系统: HarmonyOS NEXT

手机系统版本号: HarmonyOS 6.0.0

手机厂商: 华为

手机机型: Mate60

页面类型: vue

vue版本: vue3

打包方式: 云端

项目创建方式: HBuilderX

操作步骤:
  1. 在页面 mall.vue 中放置一个 web-view 组件。
  2. 操控 web-view 内部网页从 网页1 点击跳转到 网页2。
  3. 在 mall.vue 中通过自定义按钮或事件强行执行以下代码准备离场:
    const currentPage = getCurrentPages().pop();  
    const currentWebview = currentPage?.$getAppWebview?.();  
    currentWebview.close('none');
  4. 紧接着或者在下一页面尝试执行 uni.navigateBack()。
  5. 观察控制台报错及真机表现。

预期结果:

框架应当提供一种不依赖 v-if 的纯 JS 方案(或修复原生 close 的同步机制),在关闭 native 视图的同时,安全地执行类似 removePage 的生命周期,正确清理 getCurrentPages() 页面栈,不引发路由死锁。

实际结果:

控制台抛出严重崩溃:
TypeError: null is not an object (evaluating 'e.children')

并且该 Vue 页面之前的页面再也无法使用 uni.navigateBack 了,手机物理返回键、屏幕边缘侧滑返回手势全部失效。

bug描述:

在鸿蒙端 App 中,Vue 页面内部使用了 web-view 组件。当用户在 web-view 内部进行了多级页面跳转(网页1 -> 网页2)后,此时如果想要直接关闭当前 Vue 页面回到上级,会陷入以下两难死循环:
• 如果调用 uni.navigateBack(),会被框架拦截,表现为在 web-view 内部网页后退,而不是关闭 Vue 页面。
• 如果通过底层 API 强行调用 const currentPage = getCurrentPages().pop();const currentWebview = currentPage?.$getAppWebview?.();currentWebview.close('none'),界面虽然消失,但 JS 层的页面栈(getCurrentPages())依然残留该页面。
• 核心Bug:在上述强行 close 产生幽灵页面栈后,紧接着触发 uni.navigateBack(),或者用户点击手机物理返回键、使用侧滑返回手势时,App 会直接抛出未捕获的运行时异常:TypeError: null is not an object (evaluating 'e.children')。随后整个 App 的全局路由锁死,后续所有页面跳转、物理返回键、手势返回全部永久失效,应用彻底瘫痪。

2026-06-30 15:31 负责人:无 分享
已邀请:

要回复问题请先登录注册