harmony 鸿蒙ArkUI子系统变更说明
ArkUI子系统变更说明
cl.arkui.1@LocalStorageLink,@LocalStorageProp,@StorageProp(),@StorageLink,@Provide,@Consume,@Watch key值未定义校验
访问级别
公开接口
变更原因
部分状态变量装饰器的key值在使用未定义的变量时并未被校验,不符合TS语法规则,为了匹配TS语法规则,需要对这些状态变量装饰器的key值启动语法校验。
涉及的装饰器包括:
@LocalStorageLink,@LocalStorageProp,@StorageProp,@StorageLink,@Provide,@Consume,@Watch。
变更影响
@LocalStorageLink,@LocalStorageProp,@StorageProp,@StorageLink,@Provide,@Consume,@Watch key值不存在时,编译报错。
该变更为非兼容性修改。
起始API Level
@LocalStorageLink:API9,
@LocalStorageProp:API9,
@StorageProp:API7,
@StorageLink:API7,
@Provide:API7,
@Consume:API7,
@Watch:API7。
变更发生版本
从OpenHarmony SDK 5.0.0.13开始。
示例:
@Entry
@Component
struct ComA {
// ERROR: Cannot find name 'aaa'.
@StorageProp(aaa) storageProp: string = 'storageProp';
// ERROR: Cannot find name 'aaa'.
@StorageLink(aaa) storageLink: string = 'storageLink';
// ERROR: Cannot find name 'aaa'.
@LocalStorageLink(aaa) localStorageLink: string = 'localStorageLink';
// ERROR: Cannot find name 'aaa'.
@LocalStorageProp(aaa) localStorageProp: string = 'localStorageProp';
// ERROR: Cannot find name 'aaa'.
@Provide(aaa) provide: string = 'provide';
// ERROR: Cannot find name 'aaa'.
@Consume(aaa) consume: number;
// ERROR: Cannot find name 'aaa'.
@State @Watch(aaa) watch: number = 0;
build() {
}
}
适配指导
@LocalStorageLink,@LocalStorageProp,@StorageProp,@StorageLink,@Provide,@Consume,@Watch key值需要准确定义。
// test.ts
export let oneKey = 'string';
// index.ets
import { oneKey } from './test';
@Entry
@Component
struct ComA {
@StorageProp(oneKey) storageProp: string = 'storageProp';
@StorageLink(oneKey) storageLink: string = 'storageLink';
@LocalStorageLink(oneKey) localStorageLink: string = 'localStorageLink';
@LocalStorageProp(oneKey) localStorageProp: string = 'localStorageProp';
@Provide(oneKey) provide: string = 'provide';
@Consume(oneKey) consume: number;
build() {
}
}
cl.arkui.2 AppStorage,LocalStorage,PersistentStorage支持undefined和null
访问级别
公开接口
变更影响
AppStorage,LocalStorage,PersistentStorage的API方法支持null和undefined作为入参。@StorageLink,@StorageProp,@LocalStorageLink,@LocalStorageProp装饰器支持null和undefined类型。
以@StorageLink为例,当前应用存在误用null和undefined作为初始值或目标值在AppStorage中保存的情况。在更改前的语义中,null和undefined作为初始值或目标值的调用并不会生效,并给出warning。在更改后的语义中,支持了使用null和undefined作为初始值或目标值在AppStorage中保存。该更改使得以下场景中,原有应用代码运行崩溃。
更改前
class PropA {
num: number = 100;
}
AppStorage.setOrCreate("PropA", null);
AppStorage.has("PropA");// 不支持设置null或undefined,会返回false
@Entry
@Component
struct TestPage {
@StorageLink('PropA') propA: PropA = new PropA();
build() {
Column() {
Text(this.propA.num.toString()) //使用propA本地初始化的值为100
}
}
}
更改后
class PropA {
num: number = 100;
}
AppStorage.setOrCreate("PropA", null);
AppStorage.has("PropA");// 支持设置null或undefined,会返回true
@Entry
@Component
struct TestPage {
@StorageLink('PropA') propA: PropA = new PropA();
build() {
Column() {
Text(this.propA.num.toString()) //使用AppStorage初始化的值 ‘null’ ,调用时触发JsCrash
}
}
}
变更涉及接口
AppStorage:set,setOrCreate,setAndLink,setAndProp
LocalStorage:set,setOrCreate,setAndLink,setAndProp
PersistentStorage:persistProp
起始API Level
该变更从API12开始生效,API11及之前不受影响。
AppStorage
set:API10,
setOrCreate:API10,
setAndLink:API10,
setAndProp:API10
LocalStorage
set:API9,
setOrCreate:API9,
setAndLink:API9,
setAndProp:API9
PersistentStorage
persistProp:API10
变更发生版本
从OpenHarmony SDK 5.0.0.13开始。
适配指导
1、在初始化值的时候不使用null或者undefined的值来初始化,使用有意义的值来初始化。
2、将原有的值改为null或undefined会触发UI刷新。
3、在调用的地方增加判空。
class PropA {
num: number = 100;
}
AppStorage.setOrCreate("PropA", null);
AppStorage.has("PropA"); // 支持设置null或undefined,会返回true
@Entry
@Component
struct TestPage {
@StorageLink('PropA') propA: PropA|null|undefined = new PropA();
build() {
Column() {
Text(this.propA?.num.toString())//使用时进行判空,防止调用时为null和undefined的情况造成crash。
.fontSize(20)
Button("Set propA to null")
.margin(10)
.onClick(() => {
this.propA = null;
})
Button("Set propA to undefined")
.margin(10)
.onClick(() => {
this.propA = undefined;
})
Button("Assign new PropA")
.margin(10)
.onClick(() => {
this.propA = new PropA();
})
}
}
}
你可能感兴趣的鸿蒙文章
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
7、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦