在前一篇中,讲了很多开发过程中遇到的坑,这一篇仍然是一些坑(持续更新)
代码不开源,不能进行学习
android中很多实现都是可以看源码的,分析里面的原理,从而学习,进步,学会一些设计模式,一些容错方式,一些编写方法
比如最简单的,onClickListener相关逻辑会判断listener是否为空,很多新手不写这个判断从而导致空指针,虽然不是什么难点,纯粹经验也可以学会。
但,鸿蒙不是开源的,又或者我不知道应该怎么导入源码
甚至我连怎么给一个组件传递一个参数进去都不知道要怎么写
比如Image(xxx)可以传递一个参数,但是点进去之后发现
declare const Image: ImageInterface;
interface ImageInterface {
/**
* Set src to obtain images.
* @since 7
*/
/**
* Set src to obtain images
* @form
* @since 9
*/
(src: string | PixelMap | Resource): ImageAttribute;
}
只能找文档,速度上会慢很多。这对于新手可能没什么影响,但是对于有经验的人来说,会有一种自缚双臂的感觉
数据库使用page的context,是否有内存泄露
有点奇怪,数据库操作需要获得page的context,如果是这样,那是否意味着,不能移动到后台线程执行,
比如先传入pageA的context,此时后台持有pageA的context,
然后进入pageB,此时仍然持有pageA的context,是否pageA的context内存泄露了?
是否有多线程写入数据库锁死的问题?
如果有控制单线程,又会出现上面的顾虑
new worker.ThreadWorker 没有提示
new worker.ThreadWorker(‘entry/ets/workers/MyWorker.ts’)
里面的字符串路径,没有提示
没有类似于RX这样的切换线程的库,使用promise就很麻烦
比如进行主线程异步线程之间切换。
使用worker是类似通知回调的,而不是链式调用的
使用taskpool是多线程的,不能设置成单线程。有些一类的操作希望在单线程中进行
最常见的,数据库操作,文件读写,加解密、图片处理
如果使用promise,阻塞主线程
如果用taskpool,有4个线程,不能保证数据库操作在同一个线程执行,sqlite会有多线程同时写入问题
如果用worker,需要在主线程设置通知监听,在worker设置通知监听,很麻烦
没有@Deprecated注解
虽然也没什么大问题,但不好进行代码维护
dialog不能抽取公共类(其实是可以的,只是客服说不可以)
也就是说每个使用到这个dialog的页面,都需要定义一次
子组件无法获得LocalStorage
在父page通过entity接受LocalStorage后,子component无法获得这个storage对象,官网说只能被动接受从父传过来的storage,但是却获取不到这个storage对象,只能通过注解?
dialog中没办法添加自启动的动画?
dialog的声明周期没有open?,onPageShow没有被调用
在dialog中设置动画逻辑,代码结构会非常混乱,
不能自定义构造函数传参?
动画太少
不能设置动画重复?只能通过逻辑控制?
没有帧动画?
鸿蒙是不开源,看不到一些源码,都不知道怎么看逻辑
比如dialog你要看看dialog定义了哪些方法,看不了
dialog不支持物理键拦截
也就是说用dialog来做等待窗口,就有点不合适了,因为按返回键,就隐藏了,用户可以再次触发。除非自己加逻辑进行控制
预览报错
The variable with @Consume in component with @Preview may cause error in component preview mode
也就是说不能使用@Consume,不然就没办法预览,说明这俩功能是冲突的
非svg的图片没有tint方法
andriod中很多图片都是png的,如果用了tint方法,需要手动修改图片
如果在方法中定义了相同的属性,不会提示错误,但运行会报错,不会继续往下走
主线程卡死
// Image(this.currentIndex === 0 ? $r('app.media.main_dd_h') : $r('app.media.main_dd))
// .size({ width: 25, height: 25 })
Device info:OpenHarmony 3.2
Build info:OpenHarmony 3.2.9.1
Module name:com.example.xxx
Version:1.0.0
Pid:25007
Uid:20040004
Reason:THREAD_BLOCK_6S
appfreeze: com.example.xxx THREAD_BLOCK_6S at 20240507093056
类型混乱
const permissions: Array<Permissions> = ['ohos.permission.READ_CALENDAR'];
let pp :string = 'ohos.permission.READ_CALENDAR'
const temp: Array<Permissions> = [pp];
下面的temp 会报错,因为pp不是Permissions类型,但是‘’不就是包裹字符串的吗
可能是TS特性的缘故,在Java看来就有点奇怪
Flex中使用自定义组件,下方视图覆盖上方视图的底部
Flex{
MyCompon()
Grid().flexGrow(1)
}
这样一个结构,底部的Grid会覆盖上面的MyCompon一部分
如果把MyCompon中的内容给放出来,则不会覆盖
模拟器web组件按钮无法点击
卡Bug了,真机会黑屏,模拟器又无法测试,又不给用api9以上,api9以上听说好像真机也有问题