介绍
本文主要讲述在鸿蒙开发时。遇到的一些坑点。希望大家避坑。
开发环境软件环境及版本
环境 | 版本 |
---|---|
MacOS | 14.2 |
DevEco Studio | 3.1.1 Release |
Compile SDK | 3.1.0 (API9) |
Model | Stage |
langunge | ArkTs |
测试设备 | 华为P40Pro |
设备鸿蒙版本 | HarmonyOS 4.0.0.128 |
问题1 界面渲染问题
当以上述环境和测试设备开发鸿蒙原生应用时,无论是路由跳转还是定时更新页面上的某些元素。我的华为P40Pro手机都无法正常刷新显示UI,或无法正常跳转。给人的感觉就是界面卡顿。经测试后发现开发工具DevEco Studio上的预览和模拟器都可正常运行。后经搜索,发现不少人有这种问题,据说官方已经知道并打算在下版本鸿蒙Next中修改。
这也是劝退鸿蒙开发最多的地方。不知道的以为是bug,还没入门,就放弃了。
- 解决方案
- 换设备,据说华为Mate60等新设备不会出现这种问题。公司的鸿蒙4.0新平板上面运行也没有问题。此时大家如果有钱的话更新设备即可进行真机开发
- 用模拟器,既然模拟器上没有这个问题,那用模拟器就好了。但是,模拟器又会占用大量的磁盘空间(大约不到10G)和内存。比较消耗系统资源影响开发编译。我电脑启动模拟器风扇就嗡嗡作响。这条路,注定伴随噪音。
- 开启开发者模式中的显示面(Surface)更新即可。具体路径 设置->系统和更新->开发人员选项->显示面(Surface)更新,如果你能忍受频繁屏闪,这条路是最没有成本的。
问题2 EntryAbility.ts文件后缀名问题
新建工程默认的EntryAbility是ts的。但是当我们写一个ets工具类然后想在EntryAbility上使用时,会发现无法导入。Importing ArkTS files to JS and TS files is not allowed. < etsLint > 但是我写鸿蒙代码就是要写arkTs代码啊。总不能工具类啥的都写成ts把,虽然鸿蒙也支持。
- 解决方案
- 直接将这个文件的后缀名改成ets即可。没有任何副作用。(虽然不知道官方模版为什么是ts的。)
问题3 组件中width或height设置百分比 100%
我的代码是下面这个样子的。我想肯定有不少开发者也会这么写:
scss
Column(){
ActionBar({title:'设置'})
List(){
ListItem(){}
ListItem(){}
}
.width('100%')
.height('100%')
}
- 预期界面效果
顶部展示一个ActionBart,底部展示一个列表,列表可正常上下滑动。
- 实际结果
List中最底部总是显示不全,有一部分被遮挡了。而遮挡的部分高度正好是上面ActionBar组件的高度
原来鸿蒙中不管你是在什么组件上写上 .width('100%') 或 .height('100%'),他的宽高就固定死了。就是父容器的总宽度,或高度。不管你上面或下面有没有其他布局。
此案例我期望的是List占满父容器剩余空间,实际它超出父容器剩余空间ActionBar高度的距离。
你以为的不一定是你以为的 ^@^
- 解决方案
- 像上面例子的解决方案是将.height('100%')调用改成.layoutWeight(1)即可。但是此方式仅在Row/Column/Flex布局中生效。可选值为大于等于0的数字,或者可以转换为数字的字符串。
问题4 在鸿蒙Ability中设置fulllScreen后 WebView内容无法正常显示在状态栏下面总是让出一个状态栏的高度,且会自动绘制一个灰色蒙层。
WebView这个问题就比较无厘头了。查了相关文档毫无解决问题头绪,写在这里权当共同参考把。搞不懂为什么?
- 期望的样子
截图1
- 结果这样
截图2
目前我是怀疑虽然我们把当前Ability设置为全屏,而且Web组件放进了一个自定义的容器中,这个容器也可以正常显示在状态栏底部,但是Web还是一个独立的窗口。他仍然没有设置全屏。后来我翻遍了官方指南和API文档,还是没找到有相关可以改变的方法。
问题5 RelativeContainer
简介
终于得终于,重头戏来了。 相信安卓开发者们都对RelativeLayout都挺了解吧。遇见鸿蒙的RelativeContainer组件我一眼看上去跟那安卓一样啊。结果用这个玩意儿开发了一个布局后。我特么!!!让我想到了四个字,无可奈何!。
- 坑1
没有子组件,给他设置了宽高+背景颜色,它不显示。
- 坑2
RelativeContainer 中的子组件,不设置ID,子组件不显示。
- 坑3
对于宽高设置100%的子组件设置margin 无效
- 坑4
子组件设置宽高为100%时,如果父组件设置padding,则显示异常(子组件始终与父组件左上角对齐)
scss
RelativeContainer(){
Row()
.height('100%')
.width('100%')
.id('ss')
.backgroundColor('#00FF00')
}
.padding(10)
.width('100%')
.height('60vp')
.margin({
top:40
})
.backgroundColor('#FF0000')
css
//此时父组件的padding left就不生效了
left:{anchor:"__container__",align:HorizontalAlign.Start},
- 坑5
子组件宽高非100%,RelativeContainer设置padding不生效,内部子元素不会随他设置的padding向内缩进。
解决:如果是RelativeContainer 的padding left不生效给子组件设置上 offset({x:0})哪怕是0,父组件的paddingleft也生效了。但是如果给子组件设置成offset({x:16}),那么除了父组件的paddingleft生效,子组件自己设置的offset也生效了,结果就是双倍的快乐。 所以结论是是直接用offset调整组件在父组件中的左侧偏移量。给RelativeContainer设置padding不靠谱。
- 坑6
RelativeContainer的子组件如何设置它的右边距呢???
如果说左边距,可以勉强通过offset的形式设置好。那么它的右边距该如何设置呢?比如我一个按钮需要靠右上下居中对齐,且距离右侧16vp。此时offset应该怎么设置?根据前面的经验大家可能会说,offset({x:-16})里面写成-16不就好了吗。但是我亲身验证后发现,不生效!
那么,我说那么,这么简单的一个场景都实现不了。。这破相对定位容器有啥用。我目前想到的方案是,套娃。对就是套娃。
总结
这坑是一个接一个,这文章也持续更新中。。研究还在继续,请各位看官听下回分解!