鸿蒙next中web组件和navigation的一个bug以及处理方案
问题现象
在这种情况下,把controller从上层传递到最底层的web页面,用它来打开网页
刚开始一切正常,但是需要执行一些js的时候,就会出现controller未绑定的提示
特别是在连续打开好几个页面之后,从最顶部页面返回,在中间的页面就会出现该问题
例如a-b-c-d,此时从d返回c,再在c页面使用controller执行js方法,就会出现controller未绑定到webview的提示
但是此时,controller肯定是绑定过的,出现该问题是不合理的。
现象报错
简要代码
homepage
-HomeNavigation
homenavigation
-Navigation
-stack
-mywebview(在这里new webviewcontroller())
mywebview
-mywebcore(传递controller)
mywebcore
-web(最终的使用controller)
-button1 打开新页面
-button2 返回上一页并执行一段自定义js
现在我不断的点击button1使用navigation打开多个新页面,再不断点击返回,即可出现问题
排查步骤
1.首先排查是否在往navigation中添加和移除页面的过程中,是否发生了对象的销毁,经过对比对象id号,发现id未变化,说明对象不存在销毁的问题
2.排查该报错出现的原因,经过网络搜索,发现未绑定问题只会出现在new了controller但是还未传递给web组件的时候,但是我们已经打开了网页,所以肯定是绑定过的
3.经过1,2的排查,我们可以推断,这是一个系统级的bug,所以我们需要特殊管理controller
尝试解决
新建一个全局的map,当有新页面打开的时候,把对应的controller放入该map,当页面销毁时,把controller从中移除
代码改造,经过如下改造,我们已经对controller进行了单独的管理
解决代码
import web_webview from '@ohos.web.webview';
import { HashMap } from '@kit.ArkTS';
export let controllers:HashMap<string,web_webview.WebviewController> = new HashMap<string,web_webview.WebviewController>()
效果测试
改造之后,再看我们的项目运行情况,发现每次都能顺利的执行了,不再会出现未绑定的情况
结论
目前将webviewcontroller作为页面跳转参数传递,在navigation中存在bug,会导致对象的绑定状态混乱,令其无法成功调用方法。
我们需要单独使用全局的管理策略,这样可以暂时规避controller状态混乱的情况
问题本质
该问题的本质还是鸿蒙next系统在传递controller的过程中,该对象的绑定状态会丢失,判定为一个系统bug,需要等后续修复。
本文正在参加华为鸿蒙有奖征文征文活动