1# 根据卡片状态刷新不同内容 2 3 4相同的卡片可以添加到桌面上实现不同的功能,比如添加两张桌面的卡片,一张显示杭州的天气,一张显示北京的天气,设置每天早上7点触发定时刷新,卡片需要感知当前的配置是杭州还是北京,然后将对应城市的天气信息刷新到卡片上,以下示例介绍了如何根据卡片的状态动态选择需要刷新的内容。 5 6 7- 卡片配置文件:配置每30分钟自动刷新。 8 9 ```json 10 { 11 "forms": [ 12 { 13 "name": "WidgetUpdateByStatus", 14 "description": "$string:UpdateByStatusFormAbility_desc", 15 "src": "./ets/widgetupdatebystatus/pages/WidgetUpdateByStatusCard.ets", 16 "uiSyntax": "arkts", 17 "window": { 18 "designWidth": 720, 19 "autoDesignWidth": true 20 }, 21 "colorMode": "auto", 22 "isDefault": true, 23 "updateEnabled": true, 24 "scheduledUpdateTime": "10:30", 25 "updateDuration": 1, 26 "defaultDimension": "2*2", 27 "supportDimensions": [ 28 "2*2" 29 ] 30 } 31 ] 32 } 33 ``` 34 35- 卡片页面:卡片具备不同的状态选择,在不同的状态下需要刷新不同的内容,因此在状态发生变化时通过postCardAction通知EntryFormAbility。 36 37 ```ts 38 let storageUpdateByStatus = new LocalStorage(); 39 40 @Entry(storageUpdateByStatus) 41 @Component 42 struct WidgetUpdateByStatusCard { 43 @LocalStorageProp('textA') textA: Resource = $r('app.string.to_be_refreshed'); 44 @LocalStorageProp('textB') textB: Resource = $r('app.string.to_be_refreshed'); 45 @State selectA: boolean = false; 46 @State selectB: boolean = false; 47 48 build() { 49 Column() { 50 Column() { 51 Row() { 52 Checkbox({ name: 'checkbox1', group: 'checkboxGroup' }) 53 .padding(0) 54 .select(false) 55 .margin({ left: 26 }) 56 .onChange((value: boolean) => { 57 this.selectA = value; 58 postCardAction(this, { 59 action: 'message', 60 params: { 61 selectA: JSON.stringify(value) 62 } 63 }); 64 }) 65 Text($r('app.string.status_a')) 66 .fontColor('#000000') 67 .opacity(0.9) 68 .fontSize(14) 69 .margin({ left: 8 }) 70 } 71 .width('100%') 72 .padding(0) 73 .justifyContent(FlexAlign.Start) 74 75 Row() { 76 Checkbox({ name: 'checkbox2', group: 'checkboxGroup' }) 77 .padding(0) 78 .select(false) 79 .margin({ left: 26 }) 80 .onChange((value: boolean) => { 81 this.selectB = value; 82 postCardAction(this, { 83 action: 'message', 84 params: { 85 selectB: JSON.stringify(value) 86 } 87 }); 88 }) 89 Text($r('app.string.status_b')) 90 .fontColor('#000000') 91 .opacity(0.9) 92 .fontSize(14) 93 .margin({ left: 8 }) 94 } 95 .width('100%') 96 .position({ y: 32 }) 97 .padding(0) 98 .justifyContent(FlexAlign.Start) 99 } 100 .position({ y: 12 }) 101 102 Column() { 103 Row() { // 选中状态A才会进行刷新的内容 104 Text($r('app.string.status_a')) 105 .fontColor('#000000') 106 .opacity(0.4) 107 .fontSize(12) 108 109 Text(this.textA) 110 .fontColor('#000000') 111 .opacity(0.4) 112 .fontSize(12) 113 } 114 .margin({ top: '12px', left: 26, right: '26px' }) 115 116 Row() { // 选中状态B才会进行刷新的内容 117 Text($r('app.string.status_b')) 118 .fontColor('#000000') 119 .opacity(0.4) 120 .fontSize(12) 121 Text(this.textB) 122 .fontColor('#000000') 123 .opacity(0.4) 124 .fontSize(12) 125 }.margin({ top: '12px', bottom: '21px', left: 26, right: '26px' }) 126 } 127 .margin({ top: 80 }) 128 .width('100%') 129 .alignItems(HorizontalAlign.Start) 130 }.width('100%').height('100%') 131 .backgroundImage($r('app.media.CardUpdateByStatus')) 132 .backgroundImageSize(ImageSize.Cover) 133 } 134 } 135 ``` 136 137- EntryFormAbility:将卡片的状态存储在本地数据库中,在刷新事件回调触发时,通过formId获取当前卡片的状态,然后根据卡片的状态选择不同的刷新内容。 138 139 ```ts 140 import type Base from '@ohos.base'; 141 import dataPreferences from '@ohos.data.preferences'; 142 import formInfo from '@ohos.app.form.formInfo'; 143 import formProvider from '@ohos.app.form.formProvider'; 144 import formBindingData from '@ohos.app.form.formBindingData'; 145 import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility'; 146 import hilog from '@ohos.hilog'; 147 import type Want from '@ohos.app.ability.Want'; 148 149 const TAG: string = 'UpdateByStatusFormAbility'; 150 const DOMAIN_NUMBER: number = 0xFF00; 151 152 export default class UpdateByStatusFormAbility extends FormExtensionAbility { 153 onAddForm(want: Want): formBindingData.FormBindingData { 154 let formId: string = ''; 155 let isTempCard: boolean; 156 if (want.parameters) { 157 formId = JSON.stringify(want.parameters[formInfo.FormParam.IDENTITY_KEY]); 158 isTempCard = want.parameters[formInfo.FormParam.TEMPORARY_KEY] as boolean; 159 if (isTempCard === false) { // 如果为常态卡片,直接进行信息持久化 160 hilog.info(DOMAIN_NUMBER, TAG, 'Not temp card, init db for:' + formId); 161 let promise: Promise<dataPreferences.Preferences> = dataPreferences.getPreferences(this.context, 'myStore'); 162 promise.then(async (storeDB: dataPreferences.Preferences) => { 163 hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded to get preferences.'); 164 await storeDB.put('A' + formId, 'false'); 165 await storeDB.put('B' + formId, 'false'); 166 await storeDB.flush(); 167 }).catch((err: Base.BusinessError) => { 168 hilog.info(DOMAIN_NUMBER, TAG, `Failed to get preferences. ${JSON.stringify(err)}`); 169 }); 170 } 171 } 172 let formData: Record<string, Object | string> = {}; 173 return formBindingData.createFormBindingData(formData); 174 } 175 176 onRemoveForm(formId: string): void { 177 hilog.info(DOMAIN_NUMBER, TAG, 'onRemoveForm, formId:' + formId); 178 let promise = dataPreferences.getPreferences(this.context, 'myStore'); 179 promise.then(async (storeDB) => { 180 hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded to get preferences.'); 181 await storeDB.delete('A' + formId); 182 await storeDB.delete('B' + formId); 183 }).catch((err: Base.BusinessError) => { 184 hilog.info(DOMAIN_NUMBER, TAG, `Failed to get preferences. ${JSON.stringify(err)}`); 185 }); 186 } 187 188 // 如果在添加时为临时卡片,则建议转为常态卡片时进行信息持久化 189 onCastToNormalForm(formId: string): void { 190 hilog.info(DOMAIN_NUMBER, TAG, 'onCastToNormalForm, formId:' + formId); 191 let promise: Promise<dataPreferences.Preferences> = dataPreferences.getPreferences(this.context, 'myStore'); 192 promise.then(async (storeDB: dataPreferences.Preferences) => { 193 hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded to get preferences.'); 194 await storeDB.put('A' + formId, 'false'); 195 await storeDB.put('B' + formId, 'false'); 196 await storeDB.flush(); 197 }).catch((err: Base.BusinessError) => { 198 hilog.info(DOMAIN_NUMBER, TAG, `Failed to get preferences. ${JSON.stringify(err)}`); 199 }); 200 } 201 202 onUpdateForm(formId: string): void { 203 let promise: Promise<dataPreferences.Preferences> = dataPreferences.getPreferences(this.context, 'myStore'); 204 promise.then(async (storeDB: dataPreferences.Preferences) => { 205 hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded to get preferences from onUpdateForm.'); 206 let stateA = await storeDB.get('A' + formId, 'false'); 207 let stateB = await storeDB.get('B' + formId, 'false'); 208 // A状态选中则更新textA 209 if (stateA === 'true') { 210 let param: Record<string, string> = { 211 'textA': 'AAA' 212 }; 213 let formInfo: formBindingData.FormBindingData = formBindingData.createFormBindingData(param); 214 await formProvider.updateForm(formId, formInfo); 215 } 216 // B状态选中则更新textB 217 if (stateB === 'true') { 218 let param: Record<string, string> = { 219 'textB': 'BBB' 220 }; 221 let formInfo: formBindingData.FormBindingData = formBindingData.createFormBindingData(param); 222 await formProvider.updateForm(formId, formInfo); 223 } 224 hilog.info(DOMAIN_NUMBER, TAG, `Update form success stateA:${stateA} stateB:${stateB}.`); 225 }).catch((err: Base.BusinessError) => { 226 hilog.info(DOMAIN_NUMBER, TAG, `Failed to get preferences. ${JSON.stringify(err)}`); 227 }); 228 } 229 230 onFormEvent(formId: string, message: string): void { 231 // 存放卡片状态 232 hilog.info(DOMAIN_NUMBER, TAG, 'onFormEvent formId:' + formId + 'msg:' + message); 233 let promise: Promise<dataPreferences.Preferences> = dataPreferences.getPreferences(this.context, 'myStore'); 234 promise.then(async (storeDB: dataPreferences.Preferences) => { 235 hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded to get preferences.'); 236 let msg: Record<string, string> = JSON.parse(message); 237 if (msg.selectA !== undefined) { 238 hilog.info(DOMAIN_NUMBER, TAG, 'onFormEvent selectA info:' + msg.selectA); 239 await storeDB.put('A' + formId, msg.selectA); 240 } 241 if (msg.selectB !== undefined) { 242 hilog.info(DOMAIN_NUMBER, TAG, 'onFormEvent selectB info:' + msg.selectB); 243 await storeDB.put('B' + formId, msg.selectB); 244 } 245 await storeDB.flush(); 246 }).catch((err: Base.BusinessError) => { 247 hilog.info(DOMAIN_NUMBER, TAG, `Failed to get preferences. ${JSON.stringify(err)}`); 248 }); 249 } 250 } 251 ``` 252 253 254> **说明:** 255> 256> 通过本地数据库进行卡片信息的持久化时,建议先在[**onAddForm**](../reference/apis-form-kit/js-apis-app-form-formExtensionAbility.md#onaddform)生命周期中通过[**TEMPORARY_KEY**](../reference/apis-form-kit/js-apis-app-form-formInfo.md#formparam)判断当前添加的卡片是否为常态卡片:如果是常态卡片,则直接进行卡片信息持久化;如果为临时卡片,则可以在卡片转为常态卡片(**[onCastToNormalForm](../reference/apis-form-kit/js-apis-app-form-formExtensionAbility.md#oncasttonormalform)**)时进行持久化;同时需要在卡片销毁(**[onRemoveForm](../reference/apis-form-kit/js-apis-app-form-formExtensionAbility.md#onremoveform)**)时删除当前卡片存储的持久化信息,避免反复添加删除卡片导致数据库文件持续变大。 257 258