鸿蒙开发-从入门到劝退系列(更新中)

介绍

本文主要讲述在鸿蒙开发时。遇到的一些坑点。希望大家避坑。

开发环境软件环境及版本

环境 版本
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,还没入门,就放弃了。

  • 解决方案
  1. 换设备,据说华为Mate60等新设备不会出现这种问题。公司的鸿蒙4.0新平板上面运行也没有问题。此时大家如果有钱的话更新设备即可进行真机开发
  2. 用模拟器,既然模拟器上没有这个问题,那用模拟器就好了。但是,模拟器又会占用大量的磁盘空间(大约不到10G)和内存。比较消耗系统资源影响开发编译。我电脑启动模拟器风扇就嗡嗡作响。这条路,注定伴随噪音。
  3. 开启开发者模式中的显示面(Surface)更新即可。具体路径 设置->系统和更新->开发人员选项->显示面(Surface)更新,如果你能忍受频繁屏闪,这条路是最没有成本的。

问题2 EntryAbility.ts文件后缀名问题

新建工程默认的EntryAbility是ts的。但是当我们写一个ets工具类然后想在EntryAbility上使用时,会发现无法导入。Importing ArkTS files to JS and TS files is not allowed. < etsLint > 但是我写鸿蒙代码就是要写arkTs代码啊。总不能工具类啥的都写成ts把,虽然鸿蒙也支持。

  • 解决方案
  1. 直接将这个文件的后缀名改成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高度的距离。

你以为的不一定是你以为的 ^@^

  • 解决方案
  1. 像上面例子的解决方案是将.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不就好了吗。但是我亲身验证后发现,不生效!

那么,我说那么,这么简单的一个场景都实现不了。。这破相对定位容器有啥用。我目前想到的方案是,套娃。对就是套娃。

总结

这坑是一个接一个,这文章也持续更新中。。研究还在继续,请各位看官听下回分解!

相关推荐
baobao熊9 分钟前
【HarmonyOS】时间处理Dayjs
华为·harmonyos
zhongcx5 小时前
鸿蒙应用示例:DevEco Testing 工具的常用功能及使用场景
harmonyos
@海~涛7 小时前
鸿蒙OpenHarmony
华为·harmonyos
zhongcx12 小时前
鸿蒙应用示例:镂空效果实现教程
harmonyos
训山13 小时前
【11】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-模块化语法与自定义组件
笔记·学习·华为·harmonyos·鸿蒙系统
helloxmg14 小时前
鸿蒙harmonyos next flutter混合开发之开发package
flutter·华为·harmonyos
zhongcx1 天前
鸿蒙应用示例:ArkTS UI框架中的文本缩进技巧
harmonyos
东林知识库1 天前
鸿蒙NEXT开发-自定义构建函数(基于最新api12稳定版)
华为·harmonyos
裴云飞2 天前
鸿蒙性能优化之布局优化
性能优化·harmonyos
zhongcx2 天前
鸿蒙应用示例:ArkTS中设置颜色透明度与颜色渐变方案探讨
harmonyos