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 ```