基于 studio dev3.1,api 9
总结:现在的鸿蒙,感觉就像是用eclipse开发android的时候的android4.0或者4.0以下
持续更新中…
申请next,可能没通过?
没下文了。可能华为还不希望普通开发者进行开发吧。
兼容性问题
鸿蒙4.0,华为mate40E当前版本有黑屏、卡顿问题,客服说api10修复。期待下一个版本的到来(不得不说,16G 的内存,开模拟器是真的卡)
同时打开AS和DevEco Studio,会导致AS找不到Android手机设备
关闭DevEcoStudio 即可
快捷键竟然有些不一样
比如字符串资源在使用地方的展开和收起 ctrl+>
$号后,无法直接跳转到定义出
targetData: $targetData,
targetData加了$符号就无法按ctrl + 鼠标左键跳转到定义位置,而且官方好像没有对$符号进行说明
动画的架构逻辑也有点奇怪
鸿蒙的动画是,设置了属性,然后设置动画,这个动画只有动画的属性,不涉及任何属性。只要他前面的,都会生效。只要属性发生变化,就出现动画
而我们通俗的理解,应该是动画需要针对属性,包括属性的变化范围
可能这就是和android不一样的地方之一
文档不全
华为提供代码中的很多东西我都搜不到,比如@Entity,也不知道是不是我搜索的不对
list的item似乎复用有问题?
因为真机mate40E有适配问题,所以用模拟器的缘故?
1000条数据,滑动卡,滑动速度不一样,有时候滑动过头了700多直接到了400多,一般是100以内滑动
引入第三方库,无法自动导包
比如axios
ohpm install @ohos/axios
ohpm INFO: fetch meta info of package '@ohos/axios' success https://repo.harmonyos.com/ohpm/@ohos/axios
ohpm INFO: fetch package done 1 @ohos/axios https://contentcenter-drcn.dbankcdn.cn/pub_1/DevEcoSpace_DevEcoSpace_901_9/17/v3/b521c357-5d7b-44c9-9e22-7ab2d53c0756/axios-2.1.1.har
install completed in 0s 697ms
之后直接在代码中输入axios,没反应,
需要先
import axios from "@ohos/axios";
然后就可以用
testAxios(){
axios.request()
}
但是,contrl + 鼠标左键,点击axios不是到import位置,而是oh_modules@ohos\axios\index.d.ts中的
declare const axios: AxiosStatic;
远程模拟器或远程真机经常不可用
最初还以为挺好的,直到status = unavailable
可能用的人太多了?
而且api=9的机器只有一台
调试也不方便
鼠标放在变量上,不会显示变量的值,或者层次太深,不方便查看
下方一些常用的变量也需要输入才能查看值,有些时候会卡在collecting data
感觉像是卡死了,一直出不来
自己封装了axios之后,断点打不进去,但实际上可以断下来
跳转page编码时候无法自动提示相应page
也因为无法自动提示补全,所以编码不方便
鸿蒙示例代码中做了折中的处理,就是将page的路径放在一个常量中,这样使用的时候是使用常量,常量可以自动提示补全。
但是,他示例中的命名规范,我觉得不合适
/**
* Mine page url.
*/
static readonly MINE_PAGE_URL: string = 'pages/MinePage';
这个是Login模板中的代码
同一类常量,应该用相同前缀,而不是后缀,这样在编码关联的时候会比较方便
比如你输入 mina_pageurl,发现mine输入成了mina,要删除就得删除很多内容。
所以考虑到编码方便,一般用前缀
所以应该将page_url放到前面
ability中无法使用定义的常量
ts中引入CommonConstants.ts文件报错
import { CommonConstants } from '../common/constants/CommonConstants';
/**
* Lift cycle management of Ability.
*/
export default class EntryAbility extends UIAbility {
Importing ArkTS files to JS and TS files is not allowed. <etsLint>
ets(arkts)文件竟然和js、ts文件不能相互引入
示例代码中常量没有区分不同类,我认为不适合大型项目
示例代码中,所有常量,包括属性值,都放在一个常量文件下,当文件变大的时候,就会有很多常量,甚至数千行,
所以说示例代码,只能作为教学。
关于低代码,在实际项目中有很多不完善的地方
如果只是噱头,那足够了,实际用处几乎没有,就和android的layout一样,也支持拖动布局,但实际项目中,基本不会使用拖动布局。
另外还有一些不方便的地方
- 如果已经创建了page,则不能创建同名的visual page。不像android,可以重新进行对应
- 在visualPage进行编辑后,不会对应同步出现在page中,不清楚关联关系在哪里进行修改,或者不能进行修改,那我一个visual page 要怎样进行复用呢
- 对于刚接触的人而言,可能很好用,不用敲代码,实际上真正项目中,可能等找到要调整的对应属性,早就把代码敲完了。
关于示例项目中所有视图属性值常量都放在文件中
比如width、height之类的
我不太清楚这样做的原因,这样看起来非常不直观,为什么要放到常量
这里的常量是’100%’
后来我明白了,
deveco studio 是基于android studio的?
如果是这样,那就能理解了,我开始以为是基于idea的
android 对于宽度高度没有'100%'这种值,
而deveco studio没有对这个解析的改造,是照着android来的?
因此只能识别'24vp'这种值,无法识别'100%'这种值。
如果要改造,还得改代码中显示识别,工作量太大了?
所以对于'100%'这种常量值,不能放到float资源文件中,
而是要放到常量中,虽然他也是宽度的一个值。
android因为宽度值都是固定的值,没有百分比的值,所以解析上单一。
网页开发上,似乎没有将长度提取出常量这种习惯?
所以将ts用于手机开发的ide也就是androi studio或者说,deveco
再用android的思维去理解,就会有点散,不统一。
会不理解:同样是距离,为什么不放在一个文件中。
用android的思维来理解就是,一个24dp,一个50dp,放在了两个文件中
对应到鸿蒙的 24vp、100%,放在两个文件,况且100%还不是放在资源文件
或许,这是鸿蒙规则下的分类?
ets 预览之后,无法知道布局位置
像android布局之后,layout可以知道每一个view在哪个边框位置
但是鸿蒙不行,写了组件预览之后,不能标识出组件的边框位置
低代码转出来的ets代码实际使用效果和低代码不一样
Column() {
Column() {
Stack({ alignContent: Alignment.Bottom }) {
Button()
.width("180vp")
.height("80vp")
.align(Alignment.Top)
.offset({ x: "0", y: "0vp" })
.padding({ top: "0vp", bottom: "100vp" })
}
.width("100%")
.height("100%")
.align(Alignment.TopStart)
.padding({ bottom: "200vp" })
}
.width("100%")
.height("100%")
.justifyContent(FlexAlign.Center)
}
.width("100%")
.height("100%")
在低代码中是这样的
然后我发现它吧bottom解释成了topStart
在ets中是这样的
最后,我发现问题在哪了
clean value 无效
stack组件的alignContentBottom时候marginBottom无效
stack中一个button
stack设置alignContent为bottom,
之后给button设置marginBottom=100无效,(按android的理解应该是可以的)
或给stack设置paddingBottom=100无效(按android的理解应该是可以的)
鸿蒙有没有办法检测当前是root手机或者模拟器呢?
权限:系统和用户授权类型,理解起来很别扭
系统授权类型:应用被允许访问的数据不会涉及到用户或设备的敏感信息,应用被允许执行的操作不会对系统或者其他应用产生大的不利影响
用户授权类型:涉及到用户或设备的敏感信息,应用被允许执行的操作可能对系统或者其他应用产生严重的影响
按照我们的习惯,系统会进行兜底,也就是说,危险的事情,系统会控制不让你做。
但鸿蒙这里,似乎有点奇怪,系统授权类型不会对系统或其他应用产生打的不利影响
只有读写通讯录权限(ohos.permission.READ_CONTACTS、ohos.permission.WRITE_CONTACTS)可通过应用市场(AGC)使用ACL的方式跨级别申请。
也就是说,读取通话记录的功能没有了。
一些特殊功能的应用,必须上架应用市场了?
因为有些权限只能通过应用市场进行申请
一些内部使用的应用,不公开的应用,也只能上架应用市场了
鸿蒙与android开发一些概念的不同
初学,我也不确定我的理解是否正确
- 鸿蒙是一个工程可以有多个ability,就像是android一个工程可以有多个application,但是鸿蒙工程的ability的包名在AppScope文件夹下面json的key为"app": 对应,那如果我要添加其他ability呢,新建model又没有stage模型
{
"app": {
"bundleName": "com.huawei.animaterefresh",
"vendor": "example",
"versionCode": 1000000,
"versionName": "1.0.0",
"icon": "$media:app_icon",
"label": "$string:app_name"
}
}
- 鸿蒙一个应用是一个ability,每个ability可以有多个页面,页面同时也可以是组件,每个组件都可以当成一个页面。也可以被其他组件做包含(需要export进行标识)。(但是不清楚作为页面的组件是否可以被其他包含)
关于这点可以参考华为提供的代码,动画篇,
AnimateRefresh
@Entry
@Component
struct TabIndex {
build() {
Tabs({ barPosition: BarPosition.End, index: this.currentPage }) {
ForEach(CommonConstants.INDEX_TAB, (item: CardModel, index: number | undefined) => {
TabContent() {
if (index === CommonConstants.INDEX_DEFAULT_SELECT) {
FileManagerIndex()
}
}
.tabBar(this.TabBuilder(item, index))
}, (item: CardModel) => JSON.stringify(item))
}
.width(CommonConstants.FULL_LENGTH)
.height(CommonConstants.FULL_LENGTH)
.barMode(BarMode.Fixed)
.onChange((index: number) => {
this.currentPage = index;
})
}
}
@Component
export default struct FileManagerIndex {
}
- page也就是界面需要在resources\base\profile\main_pages.json中进行配置,且需要@Entity标识,否则报错
ERROR: ArkTS:ERROR File: D:/Develop/harmonyOS/learn/demo/animaterRefresh/AnimateRefresh/entry/src/main/ets/pages/TabIndex.ets
配置文件如下
{
"src": [
"pages/TabIndex",
"pages/TestPage"
]
}
- 鸿蒙低代码 == android中的layout
换了个皮,但是好像还不如android中的layout,至少从对应关系上
便捷程度没有进行对比,等进行几个项目之后再对比
开发文档
描述容易误解
在权限B的ACL使能为TRUE的情况下,此时,开发者可以使用ACL方式来申请权限B。
如果应用需要使用跨级别权限时,需使用ACL方式来申请对应权限。当前仅部分权限支持使用ACL方式申请,在应用权限列表中标记“ACL使能:TRUE,可通过应用市场(AGC)申请”的为支持ACL的权限。
实际上只有标记“ACL使能:TRUE,可通过应用市场(AGC)申请”的为支持ACL的权限。也就是说有些权限即使标记成“ACL使能:TRUE”也是不能使用的。
但是
有部分可以,具体要申请profile的时候会看到哪些可以,而不是官方文档。
鸿蒙base64 decode
如果有换行符,那么解码报错
let base64 = new util.Base64Helper();
bysKey = replaceAll(bysKey, "\n", "");
let base64KeyArr = base64.decodeSync(bysKey);
replaceAll可以用replace正则,或者自己定义一个方法替换全部换行
关系型数据库
报错会走到catch,但是没有错误信息
{AsyncCallback} callback - the row ID if the operation is successful. returns -1 otherwise.
文档中说其他情况返回-1,但实际上返回空对象