1# ArkUI子系统变更说明 2 3## cl.arkui.1@LocalStorageLink,@LocalStorageProp,@StorageProp(),@StorageLink,@Provide,@Consume,@Watch key值未定义校验 4 5**访问级别** 6 7公开接口 8 9**变更原因** 10 11部分状态变量装饰器的key值在使用未定义的变量时并未被校验,不符合TS语法规则,为了匹配TS语法规则,需要对这些状态变量装饰器的key值启动语法校验。 12 13涉及的装饰器包括: 14 15@LocalStorageLink,@LocalStorageProp,@StorageProp,@StorageLink,@Provide,@Consume,@Watch。 16 17**变更影响** 18 19@LocalStorageLink,@LocalStorageProp,@StorageProp,@StorageLink,@Provide,@Consume,@Watch key值不存在时,编译报错。 20 21该变更为非兼容性修改。 22 23**起始API Level** 24 25@LocalStorageLink:API9, 26 27@LocalStorageProp:API9, 28 29@StorageProp:API7, 30 31@StorageLink:API7, 32 33@Provide:API7, 34 35@Consume:API7, 36 37@Watch:API7。 38 39 40 41**变更发生版本** 42 43从OpenHarmony SDK 5.0.0.13开始。 44 45示例: 46 47``` 48@Entry 49@Component 50struct ComA { 51 // ERROR: Cannot find name 'aaa'. 52 @StorageProp(aaa) storageProp: string = 'storageProp'; 53 // ERROR: Cannot find name 'aaa'. 54 @StorageLink(aaa) storageLink: string = 'storageLink'; 55 // ERROR: Cannot find name 'aaa'. 56 @LocalStorageLink(aaa) localStorageLink: string = 'localStorageLink'; 57 // ERROR: Cannot find name 'aaa'. 58 @LocalStorageProp(aaa) localStorageProp: string = 'localStorageProp'; 59 // ERROR: Cannot find name 'aaa'. 60 @Provide(aaa) provide: string = 'provide'; 61 // ERROR: Cannot find name 'aaa'. 62 @Consume(aaa) consume: number; 63 // ERROR: Cannot find name 'aaa'. 64 @State @Watch(aaa) watch: number = 0; 65 66 build() { 67 } 68} 69 70``` 71 72**适配指导** 73 74 @LocalStorageLink,@LocalStorageProp,@StorageProp,@StorageLink,@Provide,@Consume,@Watch key值需要准确定义。 75 76``` 77// test.ts 78export let oneKey = 'string'; 79``` 80 81 82 83``` 84 85// index.ets 86import { oneKey } from './test'; 87@Entry 88@Component 89struct ComA { 90 @StorageProp(oneKey) storageProp: string = 'storageProp'; 91 @StorageLink(oneKey) storageLink: string = 'storageLink'; 92 @LocalStorageLink(oneKey) localStorageLink: string = 'localStorageLink'; 93 @LocalStorageProp(oneKey) localStorageProp: string = 'localStorageProp'; 94 @Provide(oneKey) provide: string = 'provide'; 95 @Consume(oneKey) consume: number; 96 97 build() { 98 } 99} 100``` 101 102 103 104 105## cl.arkui.2 AppStorage,LocalStorage,PersistentStorage支持undefined和null 106 107**访问级别** 108 109公开接口 110 111**变更影响** 112 113AppStorage,LocalStorage,PersistentStorage的API方法支持null和undefined作为入参。@StorageLink,@StorageProp,@LocalStorageLink,@LocalStorageProp装饰器支持null和undefined类型。 114 115以@StorageLink为例,当前应用存在误用null和undefined作为初始值或目标值在AppStorage中保存的情况。在更改前的语义中,null和undefined作为初始值或目标值的调用并不会生效,并给出warning。在更改后的语义中,支持了使用null和undefined作为初始值或目标值在AppStorage中保存。该更改使得以下场景中,原有应用代码运行崩溃。 116 117更改前 118 119```ts 120class PropA { 121 num: number = 100; 122} 123 124AppStorage.setOrCreate("PropA", null); 125AppStorage.has("PropA");// 不支持设置null或undefined,会返回false 126 127@Entry 128@Component 129struct TestPage { 130 @StorageLink('PropA') propA: PropA = new PropA(); 131 132 build() { 133 Column() { 134 Text(this.propA.num.toString()) //使用propA本地初始化的值为100 135 } 136 } 137} 138``` 139 140更改后 141 142```ts 143class PropA { 144 num: number = 100; 145} 146 147AppStorage.setOrCreate("PropA", null); 148AppStorage.has("PropA");// 支持设置null或undefined,会返回true 149 150@Entry 151@Component 152struct TestPage { 153 @StorageLink('PropA') propA: PropA = new PropA(); 154 155 build() { 156 Column() { 157 Text(this.propA.num.toString()) //使用AppStorage初始化的值 ‘null’ ,调用时触发JsCrash 158 } 159 } 160} 161``` 162 163**变更涉及接口** 164 165AppStorage:set,setOrCreate,setAndLink,setAndProp 166 167LocalStorage:set,setOrCreate,setAndLink,setAndProp 168 169PersistentStorage:persistProp 170 171 172**起始API Level** 173 174该变更从API12开始生效,API11及之前不受影响。 175 176AppStorage 177 178set:API10, 179 180setOrCreate:API10, 181 182setAndLink:API10, 183 184setAndProp:API10 185 186LocalStorage 187 188set:API9, 189 190setOrCreate:API9, 191 192setAndLink:API9, 193 194setAndProp:API9 195 196PersistentStorage 197 198persistProp:API10 199 200**变更发生版本** 201 202从OpenHarmony SDK 5.0.0.13开始。 203 204**适配指导** 205 2061、在初始化值的时候不使用null或者undefined的值来初始化,使用有意义的值来初始化。 207 2082、将原有的值改为null或undefined会触发UI刷新。 209 2103、在调用的地方增加判空。 211 212```ts 213class PropA { 214 num: number = 100; 215} 216 217AppStorage.setOrCreate("PropA", null); 218AppStorage.has("PropA"); // 支持设置null或undefined,会返回true 219 220@Entry 221@Component 222struct TestPage { 223 @StorageLink('PropA') propA: PropA | null | undefined = new PropA(); 224 225 build() { 226 Column() { 227 Text(this.propA?.num.toString())//使用时进行判空,防止调用时为null和undefined的情况造成crash。 228 .fontSize(20) 229 Button("Set propA to null") 230 .margin(10) 231 .onClick(() => { 232 this.propA = null; 233 }) 234 Button("Set propA to undefined") 235 .margin(10) 236 .onClick(() => { 237 this.propA = undefined; 238 }) 239 Button("Assign new PropA") 240 .margin(10) 241 .onClick(() => { 242 this.propA = new PropA(); 243 }) 244 } 245 } 246} 247```