鸿蒙开发踩坑记录 - 2024S1

UI没有跟着数据刷新

【问题】:评论面板列表-点击展开,UI没有随着数据更新?

修饰的变量怎么触发UI刷新的

@State 组件内刷新

@Prop 父组件单向刷新

@Link 父子组件双向刷新

@ObjectLink OpenHarmony ETS 类状态@Observed和@ObjectLink图文示例秒懂用法-鸿蒙开发者社区-51CTO.COM

  • 当修改嵌套对象的值,只有@ObjectLink 修饰的变量的组件会被刷新;
  • 同步源的class或者数组必须是@State,@Link,@Provide,@Consume或者@ObjectLink装饰的数据。

组件占满剩余空间

【问题】:column里的ListView下面的组件没有显示在屏幕上?

如何让组件占满column的剩余空间:.layoutWeight(1)

Row中的控件超出屏幕外

【问题】:输入框右边的按钮超出屏幕外

原因:将输入框组件的.layoutWeight(1)解决问题

string 写成了 String

string 写成了 String,传参数时报错😂

Log查看

log在Log面板,过滤查看;用第三个参数里的文本过滤

初始化对象

写comment viewmodel 时

json转成对象后,赋值给另外一个对象时,构造方法参数无法命名可读性不好;不用构造函数,先new一个对象,再给属性赋值,可读性强一些;

{} as xxx类名 这种用法在class里不可用,在struct可以用?

push(...array)用法

onClick响应链

子组件如果设置了onClick属性,就不会响应父组件的onClick属性

可选参数

方法的必填参数得放在可选参数(带?符号的)前面

Log

Log打印在控制台不显示了,代码是生效的??? --- 点了下过滤条件,一会出现了!!!

AntUI Inspector

这里应该是可以看UI布局

断点

打断点步骤:加小红点 -> 重新debug -> ok

列表数据刷新UI不刷新

【问题】splice @State 修饰的数组,ListView ForEach界面不刷新;换成@Prop 也不刷新???之前splice{} as xxx 的数据是可以刷新的,现在splice的new的对象数据不能刷新了;

【解决】没有解决,改用LazyForEach

列表性能问题

【问题】列表性能问题

文档中心

  • ForEach的itemGenerator函数可以包含if/else条件渲染逻辑。另外,也可以在if/else条件渲染语句中使用ForEach组件。
  • 在初始化渲染时,ForEach会加载数据源的所有数据,并为每个数据项创建对应的组件,然后将其挂载到渲染树上。如果数据源非常大或有特定的性能需求,建议使用LazyForEach组件。

c++编译弹窗

【问题】莫名弹框,clang、lld每次不一样,取消就编译报错;cmake xxxx 错误

【解决】在系统设置把这两个打开(后来又关闭了),就不弹框了;但是编译报错,然后clean了工程,build Hap(s),工程跑起来了 ------ 可能是跟系统权限和工程的缓存有关系吧

判断对象的类型

type of

instance of

Promise

【问题】Promise没有指定范型的类型,编译报错

【解决】Promise<>括号里指定类型(坑,搞了好久才发现是这个问题)

【问题】LazyForEach列表add多个数据时,只显示一条

【解决】notifiy的时候也需要循环多次

数组高阶函数

filter、map、flatMap用法

Span拼接

【问题】Span实现多行不同样式文本拼接,换行不紧密

【解决】设置文本折行模式word-break

文本布局-不超过屏幕宽度

【问题】:不足屏幕宽度时,按照内容的宽度;超过屏幕宽度时,显示...

【解决】:

  • Row不设置宽度,Text设置layoutWeight(1) -》 文本不会超过屏幕了,但是当内容很少时,Row的宽度也不再跟内容宽度一致而是撑满了屏幕;❌
  • Row设置width("100%"), Text设置maxLines(1) -> Row的宽度没有根据内容自适应❌
  • Row外面增加Column,Column设置width("100%"),Row不设置width =》Row的宽度不会超过屏幕,且能自适应宽度;但是Text仍然超过屏幕❌
  • 设置Row的constraintSize的maxWidth("100%"), 文本还是超出屏幕❌
  • 设置Row的constraintSize的maxWidth(具体的值)✅

最大值表示

Infinity

Pannel

可以实现半屏弹窗

Dialog

【问题】:align设置无效

【解决】:去掉NavigationDestination容器

IDE卡死

应该是华为账号登录失效了,关闭掉IDE和模拟器重启就ok了

组件导读

文档中心

鸿蒙update不下来某个库

如果删缓存重新update不下来;就将这个库直接拷贝到项目中

Log不打印Or不走断点

重新debug后,新增的不走断点或者log不打印;需要重新Run也没什么用~!

单步断点走进本不应该走进的if条件内部,造成了视觉上的错觉,应该是缓存的问题;但是在那个地方打个断点根本不会进去;

Log不打印是,前面的参数名要短一些,用最后面的参数里的字符串来过滤就能看到了!!!

鸿蒙项目更新Portal重新编译

Invalidate caches...

Build clean

删除项目里modules下面的product和mpaas-core两个文件夹

mpaas-core文件夹及下面的库怎么都拉不下来了

实在搞不好了,重新clone代码了

//该命令效果等同于上面两个命令

git submodule update --init --recursive

// 强制拉取

git submodule update --force --recursive

clone 对应分支代码

安装lfs

git submodules update(时间比较长)

sync try again(git 提交号、小蓝方块就出现了)

报错如下,删除oh_modules对应库,再build也还报错;删除,再clean,再build,没报错,可否成功run???

ERROR: EFETCH Fetch local file package error, /Users/zizi/workspace/code/
xxx/xx/oh_modules/.ohpm/@xx+cardsdk@t+kmfsej9vqtjp
hyyvpdha+cgz4=/oh_modules/@xx/cardsdk/libs/cube.har does not exist.

继续报错

> hvigor ERROR: Failed :entry:default@CompileArkTS... 
> hvigor ERROR: ArkTS Compiler Error
ERROR: ArkTS:ERROR File: /Users/zizi/workspace/code/xxx/xx/modules/mpaas-core/exthub_plugin/src/main/ets/MiddleInit.ets:15:12
 Cannot find module '@xx/aptrip/src/main/ets/extensions/ApTripExtension' or its corresponding type declarations.

然后签名报错,注释掉签名的代码

报错

03/07 17:39:49: Install Failed: error: failed to install bundle.
code:9568289
error: install failed due to grant request permissions failed.
View detailed instructions.
$ hdc shell rm -rf data/local/tmp/355db946fb4544019a22d2915596d59b
Error while Deploy Hap

File -> project structure -> Automatically generate signature 勾选上 -> 登录华为账号

还是报上面的错;又把注释掉的签名代码释放出来;

还是报错

> hvigor ERROR: Failed :entry:default@SignHap... 
> hvigor ERROR: Failed to find the incremental input file: /Users/wang/.ohos/config/default_xxx_prAtFBsvjlZxnni3Y9pR0FYQXrNORlVW38SMZmqMdd0=.cer.
> hvigor ERROR: BUILD FAILED in 1 min 6 s 765 ms 

f:勾上自动生成(发现前面的操作后确实没勾选上),再点apply,等他生成到json里再点ok(群里的指点)

还是报错

03/07 18:00:59: Install Failed: error: failed to install bundle.
code:9568332
error: install sign info inconsistent.
View detailed instructions.
$ hdc shell rm -rf data/local/tmp/bf18e894d585483c9af8e3990db1b4c1
Error while Deploy Hap

打开自动签名面板查看,居然还是未勾选的状态😭,重复上面的操作,重新生成json文件

报错,自动签名勾选不上

不用管上面这个报错!!!注释掉签名,勾选自动签名,多跑几次!

注释掉签名,sync, 再按照第f步操作了两遍,居然跑起来了

第二天将living仓库切到first分支,代码又报错的

oh-pachege.json5 run oh install,代码报错消失,run还是报上面的错

build clean 再run,成功了?!

重新编译流程

在摸爬滚打中摸索了一套「拉完代码一把能跑起来」的操作,跟大家分享下:

删除portal根目录下的oh_modules

关闭IDE

git reset --hard HEAD

git submodule foreach --recursive

git reset --hard HEAD

git clean -fdx

git submodule foreach --recursive

git clean -fdx

git pull

git submodule update --init --recursive

打开IDEBuild > Rebuild ProjectSync运行此时再有编译报错,那基本就是代码问题了,可以先注释掉跑错的代码。。

关键命令执行这两条就可以:
git clean -fdx
git submodule foreach --recursive git clean -fdx

原因是中间过程文件导致扫描的node崩溃。

注意:
1. 以上两条命令会删掉版本控制以外的所有文件,注意保存编译中的文件。
2. 该命令会清掉dependencies目录及hvigor-config.json5,需要重新配置hvigor

ohpm长时间fetch package卡住不动

今天开发时遇到鸿蒙IDE 4.1.3.500的问题, 排查很久终于解决, 大家在构建portal时,如果遇到IDE sync 时ohpm长时间fetch package卡住不动,可通过更新ohpm的方式解决。
具体为:将本地 IDE 安装目录下 /Applications/DevEco-Studio.app/Contents/tools 下的ohpm 替换为 4.1.3.700 IDE 下的ohpm.
ohpm我压缩了下,大家自取更换即可

JS heap out of memory 优化的办法

hvigor-config.json5 添加"nodeOptions": { "maxOldSpaceSize": 200000}

JS heap out of memory 问题,经华为定位如下:

maxOldSpaceSize配置没生效,原因是daemon task进程一直在后台工作,重启IDE也没能重启该进程。
修改maxOldSpaceSize配置之后,有两种方法可以重启daemon task

  1. 使用命令停止daemon task
    ./hvigorw --stop-daemon
  2. 通过设置重启daemon task
    在菜单 Preferences->Build,Execution,Deployment->Build Tools->Hvigor里,
    将Enable the Daemon for tasks对勾去掉。重启IDE后再打开。

另外,该选项对勾去掉后,debug会比较流畅

Clean后编译c++报错

> hvigor ERROR: Failed :product_messagebox:default@BuildNativeWithNinja... 
> hvigor ERROR: Tools execution failed.
Command failed with exit code 1:

尝试解决

1、重启IDE,hvigor sync,ide状态栏都没有爆红的了;编译仍报错

2、在大群搜索同样类型的报错,删除掉报错模块下的cxx,再build clean,然后build hap(S);还是一样报错;

3、anc clean -r

Release Note For Version 0.6.9 Date <2024-3-27> 

Bug Fixes 

   新增fix指令修复DevEco Studio patch功能

[  PROMPT ] : AntCLI is about to be updated to 0.6.9, continue ? (Y/n) 

Y

还是报错

可能是缺少了这个文件,已经不想再试了,新clone的已经跑起来了

4、重新clone了最新first分支,全部都改成了版本依赖

一开始没有替换hvigor-config.json5里的内容,编译报错;

替换了hvigor-config.json5里的内容后,报如下错

04/05 18:25:45: Install Failed: error: failed to install bundle.
code:9568289
error: install failed due to grant request permissions failed.

打开自动签名(File -> Project Structure 这里打开IDE总是卡死,在IDE右上角的小图标顺利打开)

if()判断对象是否为空用法注意

if()括号里为对象判空没问题

if()括号里为number时,当number=0;为false,不能作为判空依据

if('0')这种情况没试过

本地构建模块har包

方法一

./hvigorw clean --mode module -p module=product_content_rpc --no-daemon -p buildMode=release assembleHar

方法二

选中你要构建的模块然后选build中的这个

枚举值比较

枚举放在if里比较是否相等,要用===

表情面板监听状态变化去做操作的坑

这样虽然很方便,写的代码很简洁;但是如果状态变化的来源比较复杂,细分情况比较多,统一处理的粒度太大的话,也会有问题的。最好是情况比较单一清晰的状况下使用这种粗力度的监听处理。

IDE使用技巧

command + 触控板两指上下滑动可以设置字体大小

Json.parse

parse 空字符串""或者undefined会闪退

parse null 不会闪退

Promise

audio库的回调不生效

局部变量的回调不会生效,因为局部变量出了方法体会释放掉

系统组件的属性状态变化设置

场景:

给statck设置背景色,直接用@State 的颜色变量设置不生效;

用get方法获取的颜色值也不生效;

onVisibleAreaChange

stack里组件被挡住了不响应

export default

华为开发者文章

比较表达式

错误示范:找不到元素

let index = this.alreadyExistDataPages.findIndex((element) => {
      return element == pageIndex
    })

正确示范:可以正常找到元素

let index = this.alreadyExistDataPages.findIndex((element) => {
      let isEqual = element == pageIndex
      return isEqual
    })

网络请求状态判断适合放到业务层

@Trace刷新UI问题

@Trace修饰的字段,短时间内(ms内),刷新多个状态只会响应最后一个状态刷新

自定义组件加通用属性,会有问题

  • 在自定义组件上加了padding,导致组件底层的组件都不响应事件了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值