• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 通过router或call事件刷新卡片内容
2
3
4在卡片页面中可以通过**postCardAction**接口触发router事件或者call事件拉起UIAbility,然后由UIAbility刷新卡片内容,下面是这种刷新方式的简单示例。
5
6> **说明:**
7>
8> 本文主要介绍动态卡片的事件开发。对于静态卡片,请参见[FormLink](../reference/arkui-ts/ts-container-formlink.md)。
9
10## 通过router事件刷新卡片内容
11
12- 在卡片页面通过注册Button的onClick点击事件回调,并在回调中调用**postCardAction**接口触发router事件拉起UIAbility。
13
14  ```ts
15  let storage = new LocalStorage();
16  @Entry(storage)
17  @Component
18  struct WidgetCard {
19    @LocalStorageProp('detail') detail: string = 'init';
20
21    build() {
22      Column() {
23        Button('跳转')
24          .margin('20%')
25          .onClick(() => {
26            console.info('postCardAction to EntryAbility');
27            postCardAction(this, {
28              action: 'router',
29              abilityName: 'EntryAbility', // 只能跳转到当前应用下的UIAbility
30              params: {
31                detail: 'RouterFromCard'
32              }
33            });
34          })
35        Text(`${this.detail}`).margin('20%')
36      }
37      .width('100%')
38      .height('100%')
39    }
40  }
41  ```
42
43- 在UIAbility的onCreate()或者onNewWant()生命周期中可以通过入参want获取卡片的formID和传递过来的参数信息,然后调用[updateForm](../reference/apis/js-apis-app-form-formProvider.md#updateform)接口刷新卡片。
44
45  ```ts
46  import UIAbility from '@ohos.app.ability.UIAbility';
47  import formBindingData from '@ohos.app.form.formBindingData';
48  import formProvider from '@ohos.app.form.formProvider';
49  import formInfo from '@ohos.app.form.formInfo';
50  import AbilityConstant from '@ohos.app.ability.AbilityConstant';
51  import Want from '@ohos.app.ability.Want';
52  import Base from '@ohos.base'
53
54  export default class EntryAbility extends UIAbility {
55    // 如果UIAbility第一次启动,在收到Router事件后会触发onCreate生命周期回调
56    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
57      this.handleFormRouterEvent(want);
58    }
59
60    handleFormRouterEvent(want: Want) {
61      console.info('Want:' + JSON.stringify(want));
62      if (want.parameters && want.parameters[formInfo.FormParam.IDENTITY_KEY] !== undefined) {
63        let curFormId = want.parameters[formInfo.FormParam.IDENTITY_KEY].toString();
64        let message: string = JSON.parse(want.parameters.params.toString()).detail;
65        console.info(`UpdateForm formId: ${curFormId}, message: ${message}`);
66        let formData: Record<string, string> = {
67          "detail": message + ': UIAbility.', // 和卡片布局中对应
68        };
69        let formMsg = formBindingData.createFormBindingData(formData)
70        formProvider.updateForm(curFormId, formMsg).then((data) => {
71          console.info('updateForm success.' + JSON.stringify(data));
72        }).catch((error: Base.BusinessError) => {
73          console.error('updateForm failed:' + JSON.stringify(error));
74        })
75      }
76    }
77    // 如果UIAbility已在后台运行,在收到Router事件后会触发onNewWant生命周期回调
78    onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam) {
79      console.info('onNewWant Want:' + JSON.stringify(want));
80      if (want.parameters && want.parameters[formInfo.FormParam.IDENTITY_KEY] !== undefined) {
81        let curFormId = want.parameters[formInfo.FormParam.IDENTITY_KEY].toString();
82        let message: string = JSON.parse(want.parameters.params.toString()).detail;
83        console.info(`UpdateForm formId: ${curFormId}, message: ${message}`);
84        let formData: Record<string, string> = {
85          "detail": message + ': onNewWant UIAbility.', // 和卡片布局中对应
86        };
87        let formMsg = formBindingData.createFormBindingData(formData)
88        formProvider.updateForm(curFormId, formMsg).then((data) => {
89          console.info('updateForm success.' + JSON.stringify(data));
90        }).catch((error: Base.BusinessError) => {
91          console.error('updateForm failed:' + JSON.stringify(error));
92        })
93      }
94    }
95
96    ...
97  }
98  ```
99
100## 通过call事件刷新卡片内容
101
102- 在使用**postCardAction**接口的call事件时,需要在FormExtensionAbility中的onAddForm生命周期回调中更新formId。
103
104   ```ts
105   import formBindingData from '@ohos.app.form.formBindingData';
106   import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility';
107   import Want from '@ohos.app.ability.Want';
108
109   export default class EntryFormAbility extends FormExtensionAbility {
110    onAddForm(want: Want) {
111      class DataObj1 {
112        formId: string = ""
113      }
114      let dataObj1 = new DataObj1();
115      if (want.parameters && want.parameters["ohos.extra.param.key.form_identity"] != undefined) {
116        let formId: string = want.parameters["ohos.extra.param.key.form_identity"].toString();
117        dataObj1.formId = formId;
118      }
119      let obj1 = formBindingData.createFormBindingData(dataObj1);
120      return obj1;
121    }
122    ...
123   };
124   ```
125
126- 在卡片页面通过注册Button的onClick点击事件回调,并在回调中调用**postCardAction**接口触发call事件拉起UIAbility。
127
128  ```ts
129  let storage = new LocalStorage();
130  @Entry(storage)
131  @Component
132  struct WidgetCard {
133    @LocalStorageProp('detail') detail: string = 'init';
134    @LocalStorageProp('formId') formId: string = '0';
135
136    build() {
137      Column() {
138        Button('拉至后台')
139          .margin('20%')
140          .onClick(() => {
141            console.info('postCardAction to EntryAbility');
142            postCardAction(this, {
143              action: 'call',
144              abilityName: 'EntryAbility', // 只能拉起当前应用下的UIAbility
145              params: {
146                method: 'funA',
147                formId: this.formId,
148                detail: 'CallFrom'
149              }
150            });
151          })
152        Text(`${this.detail}`).margin('20%')
153      }
154      .width('100%')
155      .height('100%')
156    }
157  }
158  ```
159
160- 在UIAbility的onCreate生命周期中监听call事件所需的方法,然后在对应方法中调用[updateForm](../reference/apis/js-apis-app-form-formProvider.md#updateform)接口刷新卡片。
161
162  ```ts
163  import UIAbility from '@ohos.app.ability.UIAbility';
164  import formBindingData from '@ohos.app.form.formBindingData';
165  import formProvider from '@ohos.app.form.formProvider';
166  import Want from '@ohos.app.ability.Want';
167  import Base from '@ohos.base'
168  import rpc from '@ohos.rpc';
169  import AbilityConstant from '@ohos.app.ability.AbilityConstant';
170
171  const MSG_SEND_METHOD: string = 'funA';
172
173  class MyParcelable implements rpc.Parcelable {
174    num: number;
175    str: string;
176    constructor(num: number, str: string) {
177      this.num = num;
178      this.str = str;
179    }
180    marshalling(messageSequence: rpc.MessageSequence): boolean {
181      messageSequence.writeInt(this.num);
182      messageSequence.writeString(this.str);
183      return true;
184    }
185    unmarshalling(messageSequence: rpc.MessageSequence): boolean {
186      this.num = messageSequence.readInt();
187      this.str = messageSequence.readString();
188      return true;
189    }
190  }
191
192  // 在收到call事件后会触发callee监听的方法
193  let FunACall = (data: rpc.MessageSequence) => {
194    // 获取call事件中传递的所有参数
195    let params: Record<string, string> = JSON.parse(data.readString())
196    if (params.formId !== undefined) {
197      let curFormId: string = params.formId;
198      let message: string = params.detail;
199      console.info(`UpdateForm formId: ${curFormId}, message: ${message}`);
200      let formData: Record<string, string> = {
201        "detail": message
202      };
203      let formMsg: formBindingData.FormBindingData = formBindingData.createFormBindingData(formData);
204      formProvider.updateForm(curFormId, formMsg).then((data) => {
205        console.info('updateForm success.' + JSON.stringify(data));
206      }).catch((error: Base.BusinessError) => {
207        console.error('updateForm failed:' + JSON.stringify(error));
208      })
209    }
210    return new MyParcelable(1, 'aaa');
211  }
212
213  export default class EntryAbility extends UIAbility {
214    // 如果UIAbility第一次启动,call事件后会触发onCreate生命周期回调
215    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
216      console.info('Want:' + JSON.stringify(want));
217      try {
218        // 监听call事件所需的方法
219        this.callee.on(MSG_SEND_METHOD, FunACall);
220      } catch (error) {
221        console.info(`${MSG_SEND_METHOD} register failed with error ${JSON.stringify(error as Base.BusinessError)}`)
222      }
223    }
224  }
225  ```