当前位置:首页 > 技术文章 > 正文内容

鸿蒙next中web组件和navigation的一个bug以及处理方案

u3blog3个月前 (08-30)技术文章188

问题现象

在这种情况下,把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,需要等后续修复。

本文正在参加华为鸿蒙有奖征文征文活动

扫描二维码推送至手机访问。

版权声明:本文由u3blog发布,如需转载请注明出处。

本文链接:https://u3blog.xyz/?id=706

分享给朋友:

“鸿蒙next中web组件和navigation的一个bug以及处理方案” 的相关文章

开源数据库Postgresql安装/卸载总结

What Postgresql一个开源数据库,类似mysql,由于mysql被收购了,这个数据库正被越来越多的使用 怎么安装?安装非常简单,但是安装过后的初始化还是有点麻烦,具体可以看这篇文章为什么要卸载?安装好之后,如果你很倒霉的话,会遇到postgresql服务怎么都启动不了,输入psql指令显...

AndroidStudio插件开发——RemoveButterKnife从构思到实现

AndroidStudio插件开发——RemoveButterKnife从构思到实现

ReomveButterKnife插件这是一个用于移除代码中对ButterKnife使用的AS插件,接下来我们将从头开始讲讲AS插件开发和这个插件的开发过程地址是<a href="https://github.com/u3shadow/RemoveButterKnife"...

项目的改造——RemoveButterKnife插件代码的重构

项目的改造——RemoveButterKnife插件代码的重构

前言这篇文章记述了我的插件RemoveButterKnife的代码改进过程以及思路,关于插件,各位可以看RemoveButterKnife代码库,关于文章,可以看构思到实现RemoveButterKnife 原因近期想给原来的插件RemoveButterKnife加入一些新的功能,发现以前的代码没...

项目的升级-给RemoveButterKnife插件增加新功能

项目的升级-给RemoveButterKnife插件增加新功能

前言经过项目的初步编写和进一步改造,RemoveButterKnife插件终于也有模有样了,但是,功能上仅仅支持Activity/Fragment的BindView注解。 关于编写和优化的过程可以看下面两篇文章项目构造RemoveButterKnife 项目改进-重构RemoveButterKn...

Android测试体系-在MVVM架构中如何测试Model层与ViewModel层

背景此文章是对于google code lab中《Introduction to Test Double and Dependence injection》 与 《Testing Basics》的总结,本篇主要讲述如何在mvvm架构的android项目中对Model层以及ViewModel层进行测试...

使用Databinding为Recyclerview使用同一个ViewHolder加载不同Item

提示:在阅读本篇文章前,你最好对android databinding有一定了解,本文使用的代码均为kotlin,但是不用担心,都很简单 最近在写项目的时候使用了databinding技术,突发奇想,databinding是不是也能应用于recyclerview中,让加载多个不同的item更简单呢...

评论列表

高管电子邮件列表
2个月前 (09-29)

如果您购买执行列表,我们将通过提供最新且预先验证过的电子邮件地址来确保您的执行列表到达正确的受众。由于我们的电子邮件列表是可定制的,因此请购买执行列表并联系对您的产品感兴趣的客户。

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。