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 { Want } from '@kit.AbilityKit';
141  import { preferences } from '@kit.ArkData';
142  import { BusinessError } from '@kit.BasicServicesKit';
143  import { formBindingData, FormExtensionAbility, formInfo, formProvider } from '@kit.FormKit';
144  import { hilog } from '@kit.PerformanceAnalysisKit';
145
146  const TAG: string = 'UpdateByStatusFormAbility';
147  const DOMAIN_NUMBER: number = 0xFF00;
148
149  export default class UpdateByStatusFormAbility extends FormExtensionAbility {
150    onAddForm(want: Want): formBindingData.FormBindingData {
151      let formId: string = '';
152      let isTempCard: boolean;
153      if (want.parameters) {
154        formId = want.parameters[formInfo.FormParam.IDENTITY_KEY].toString();
155        isTempCard = want.parameters[formInfo.FormParam.TEMPORARY_KEY] as boolean;
156        if (isTempCard === false) { // 如果为常态卡片,直接进行信息持久化
157          hilog.info(DOMAIN_NUMBER, TAG, 'Not temp card, init db for:' + formId);
158          let promise: Promise<preferences.Preferences> = preferences.getPreferences(this.context, 'myStore');
159          promise.then(async (storeDB: preferences.Preferences) => {
160            hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded to get preferences.');
161            await storeDB.put('A' + formId, 'false');
162            await storeDB.put('B' + formId, 'false');
163            await storeDB.flush();
164          }).catch((err: BusinessError) => {
165            hilog.info(DOMAIN_NUMBER, TAG, `Failed to get preferences. ${JSON.stringify(err)}`);
166          });
167        }
168    }
169      let formData: Record<string, Object | string> = {};
170      return formBindingData.createFormBindingData(formData);
171    }
172
173    onRemoveForm(formId: string): void {
174      hilog.info(DOMAIN_NUMBER, TAG, 'onRemoveForm, formId:' + formId);
175      let promise = preferences.getPreferences(this.context, 'myStore');
176      promise.then(async (storeDB) => {
177        hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded to get preferences.');
178        await storeDB.delete('A' + formId);
179        await storeDB.delete('B' + formId);
180      }).catch((err: BusinessError) => {
181      hilog.info(DOMAIN_NUMBER, TAG, `Failed to get preferences. ${JSON.stringify(err)}`);
182      });
183    }
184
185    // 如果在添加时为临时卡片,则建议转为常态卡片时进行信息持久化
186    onCastToNormalForm(formId: string): void {
187      hilog.info(DOMAIN_NUMBER, TAG, 'onCastToNormalForm, formId:' + formId);
188      let promise: Promise<preferences.Preferences> = preferences.getPreferences(this.context, 'myStore');
189      promise.then(async (storeDB: preferences.Preferences) => {
190        hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded to get preferences.');
191        await storeDB.put('A' + formId, 'false');
192        await storeDB.put('B' + formId, 'false');
193        await storeDB.flush();
194      }).catch((err: BusinessError) => {
195      hilog.info(DOMAIN_NUMBER, TAG, `Failed to get preferences. ${JSON.stringify(err)}`);
196      });
197    }
198
199    onUpdateForm(formId: string): void {
200      let promise: Promise<preferences.Preferences> = preferences.getPreferences(this.context, 'myStore');
201      promise.then(async (storeDB: preferences.Preferences) => {
202        hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded to get preferences from onUpdateForm.');
203        let stateA = await storeDB.get('A' + formId, 'false');
204        let stateB = await storeDB.get('B' + formId, 'false');
205        // A状态选中则更新textA
206        if (stateA === 'true') {
207          let param: Record<string, string> = {
208            'textA': 'AAA'
209          };
210          let formInfo: formBindingData.FormBindingData = formBindingData.createFormBindingData(param);
211          await formProvider.updateForm(formId, formInfo);
212        }
213        // B状态选中则更新textB
214        if (stateB === 'true') {
215          let param: Record<string, string> = {
216            'textB': 'BBB'
217          };
218          let formInfo: formBindingData.FormBindingData = formBindingData.createFormBindingData(param);
219        await formProvider.updateForm(formId, formInfo);
220        }
221        hilog.info(DOMAIN_NUMBER, TAG, `Update form success stateA:${stateA} stateB:${stateB}.`);
222      }).catch((err: BusinessError) => {
223        hilog.info(DOMAIN_NUMBER, TAG, `Failed to get preferences. ${JSON.stringify(err)}`);
224      });
225    }
226
227    onFormEvent(formId: string, message: string): void {
228      // 存放卡片状态
229      hilog.info(DOMAIN_NUMBER, TAG, 'onFormEvent formId:' + formId + 'msg:' + message);
230      let promise: Promise<preferences.Preferences> = preferences.getPreferences(this.context, 'myStore');
231      promise.then(async (storeDB: preferences.Preferences) => {
232        hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded to get preferences.');
233        let msg: Record<string, string> = JSON.parse(message);
234        if (msg.selectA !== undefined) {
235          hilog.info(DOMAIN_NUMBER, TAG, 'onFormEvent selectA info:' + msg.selectA);
236          await storeDB.put('A' + formId, msg.selectA);
237        }
238        if (msg.selectB !== undefined) {
239          hilog.info(DOMAIN_NUMBER, TAG, 'onFormEvent selectB info:' + msg.selectB);
240          await storeDB.put('B' + formId, msg.selectB);
241        }
242        await storeDB.flush();
243      }).catch((err: BusinessError) => {
244        hilog.info(DOMAIN_NUMBER, TAG, `Failed to get preferences. ${JSON.stringify(err)}`);
245      });
246    }
247  }
248  ```
249
250
251> **说明:**
252>
253> 通过本地数据库进行卡片信息的持久化时,建议先在[**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)**)时删除当前卡片存储的持久化信息,避免反复添加删除卡片导致数据库文件持续变大。
254
255