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