【关键字】
web组件 / webcontroller / 调用 / webInited
【问题描述】
想要使用webcontroller前必须要监听web_webview的webInited事件,如果在此事件之前调用webcontroller中的方法,则会爆出运行时异常,其内容为该webcontroller必须初始化后才可使用。
又因为web组件和webcontroller是1:1的关系。所以自然而然认为web_webview的webInited事件也应当与web组件是1:1的关系。
现在的场景是应用的主页有一个tabbar视图,里面有四个tab页,每个tab上都有一个web组件。发现即使每个web组件里都去监听了web_webview的webInited事件,但事件仅回调了一次,导致首页上仅一个web能够正确初始化,因为在webInited事件中,调用了webcontroller对web组件进行了属性设置。如果不在该事件中处理,则会报前面提到的运行时异常。
还发现当打开二级页面,也就是再打开一个entry时,webInited事件才会再次触发,即webInited事件是页面级事件,并非跟着web组件走而是跟着页面走的。
所以个人排查的结论是web_webview webInited事件其内部并没有做成队列结构,而是多次注册只响应最后一次,因此在这种场景下,只回调一次实际上是经过四次init事件覆盖后,仅最后一个web的事件回来了而已。
请问这个状态是设计如此?还是设计缺陷?
【解决方案】
如果需要在web页面加载前,调用webcontroller中的方法,可以使用onPageBegin或使用onControllerAttached回调。
onControllerAttached文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-web-0000001860247877#ZH-CN_TOPIC_0000001860247877__oncontrollerattached10