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
- 使用命令停止daemon task
./hvigorw --stop-daemon - 通过设置重启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,导致组件底层的组件都不响应事件了