1# Editing and Updating the Widget Content 2 3The home screen provides a unified widget editing page. The widget provider uses [FormEditExtensionAbility](../reference/apis-form-kit/js-apis-app-form-formEditExtensionAbility.md) provided by the widget framework to develop the widget editing function. 4 5## How to Develop 61. In the entry module of the project, create a code file named EntryFormEditAbility. In the EntryFormEditAbility file, implement the [startSecondPage](../reference/apis-form-kit/js-apis-inner-application-formEditExtensionContext.md#startsecondpage) method. In the [onSessionCreate](../reference/apis-form-kit/js-apis-app-form-formEditExtensionAbility.md#onsessioncreate) callback method, load the level-1 widget editing page and transfer the implementation of the **startSecondPage** method to the level-1 widget editing page. 7 8```ts 9// src/main/ets/entryformeditability/EntryFormEditAbility.ets 10 11import { FormEditExtensionAbility } from '@kit.FormKit'; 12import { Want,UIExtensionContentSession } from '@kit.AbilityKit'; 13import { ExtensionEvent } from '../pages/model/ExtensionEvent'; 14 15const TAG: string = 'FormEditDemo[EntryFormEditAbility] -->'; 16export default class EntryFormEditAbility extends FormEditExtensionAbility { 17 onCreate() { 18 console.log(`${TAG} onCreate`); 19 } 20 onForeground(): void { 21 console.log(`${TAG} EntryFormEditAbility onForeground.....`); 22 } 23 onBackground(): void { 24 console.log(`${TAG} EntryFormEditAbility onBackground......`); 25 } 26 onDestroy(): void { 27 console.log(`${TAG} EntryFormEditAbility onDestroy......`); 28 } 29 onSessionCreate(want: Want, session: UIExtensionContentSession) { 30 console.log(`${TAG} onSessionCreate start..... want: ${JSON.stringify(want)}`); 31 let storage: LocalStorage = new LocalStorage(); 32 let extensionEvent: ExtensionEvent = new ExtensionEvent(); 33 extensionEvent.setStartSecondPage(() => this.startSecondPage()); 34 storage.setOrCreate('extensionEvent', extensionEvent); 35 try { 36 session.loadContent('pages/Extension', storage); 37 session.setWindowBackgroundColor('#00000000'); 38 } catch (e) { 39 console.log(`${TAG} EntryFormEditAbility loadContent err, want: ${JSON.stringify(e)}`); 40 } 41 } 42 onSessionDestroy(session: UIExtensionContentSession) { 43 console.log(`${TAG} onSessionDestroy`); 44 } 45 private startSecondPage(): void { 46 const bundleName: string = this.context.extensionAbilityInfo.bundleName; 47 const secPageAbilityName: string = 'FormEditSecPageAbility'; 48 console.log(`${TAG} startSecondPage. bundleName: ${bundleName}, secPageAbilityName: ${secPageAbilityName}.`); 49 try { 50 this.context.startSecondPage({ 51 bundleName: bundleName, 52 parameters: { 53 "secPageAbilityName": secPageAbilityName 54 } 55 }); 56 } catch (err) { 57 console.log(`${TAG} startSecondPage failed: ${err}`); 58 } 59 } 60}; 61``` 62 632. Add an extension file to display the level-1 editing page of the widget. 64 65```ts 66// src/main/ets/pages/Extension.ets 67 68import { UIExtensionContentSession } from '@kit.AbilityKit'; 69import { ExtensionEvent } from './model/ExtensionEvent'; 70 71let storage = LocalStorage.getShared(); 72const TAG: string = 'FormEditDemo[Extension] -->'; 73@Entry(storage) 74@Component 75struct Extension { 76 @State message: string = 'UIExtension Provider'; 77 private session: UIExtensionContentSession | undefined = storage.get<UIExtensionContentSession>('session'); 78 private extensionEvent: ExtensionEvent | undefined = storage.get<ExtensionEvent>('extensionEvent'); 79 onPageShow() { 80 console.log(`${TAG} onPageShow. extensionEvent: ${JSON.stringify(this.extensionEvent)}, session: ${JSON.stringify(this.session)}.`); 81 } 82 build() { 83 Row() { 84 Column() { 85 Text(this.message) 86 .fontSize(20) 87 .fontWeight(FontWeight.Bold) 88 .textAlign(TextAlign.Center) 89 Button("Add") 90 .width('80%') 91 .type(ButtonType.Capsule) 92 .margin({ 93 top: 20 94 }) 95 .onClick(() => { 96 console.log(`${TAG} Button onClick`); 97 this.extensionEvent?.startFormEditSecondPage(); 98 }) 99 } 100 } 101 .justifyContent(FlexAlign.Center) 102 .width('100%') 103 } 104} 105``` 106 1073. Add the ExtensionEvent file and use the **startFormEditSecondPage** method to invoke the [startSecondPage](../reference/apis-form-kit/js-apis-inner-application-formEditExtensionContext.md#startsecondpage) method. 108 109```ts 110// src/main/ets/widget/pages/model/ExtensionEvent.ets 111 112const TAG: string = 'FormEditDemo[ExtensionEvent] -->'; 113export class ExtensionEvent { 114 private startSecondPage: () => void = () => { 115 console.log(`${TAG} startSecondPage is empty!`); 116 }; 117 public setStartSecondPage(startSecondPage: () => void) { 118 console.log(`${TAG} setStartSecondPage`); 119 this.startSecondPage = startSecondPage; 120 } 121 public startFormEditSecondPage(): void { 122 console.log(`${TAG} startFormEditSecondPage`); 123 this.startSecondPage(); 124 } 125} 126 127``` 128 1294. Add the widget editing configuration to the [module.json5](../quick-start/module-configuration-file.md) configuration file of the application. 130 131```json 132"extensionAbilities": [ 133 { 134 "name": "EntryFormEditAbility", 135 "srcEntry": "./ets/entryformeditability/EntryFormEditAbility.ets", 136 "type": "formEdit" 137 } 138] 139``` 140 1415. Add the formConfigAbility configuration to the [form_config.json](./arkts-ui-widget-configuration.md) configuration file of the widget. 142 143```json 144{ 145 "forms": [ 146 { 147 "name": "widget", 148 "displayName": "$string:widget_display_name", 149 "description": "$string:widget_desc", 150 "src": "./ets/widget/pages/WidgetCard.ets", 151 "uiSyntax": "arkts", 152 "formConfigAbility": "ability://EntryFormEditAbility", 153 "window": { 154 "designWidth": 720, 155 "autoDesignWidth": true 156 }, 157 "colorMode": "auto", 158 "isDynamic": true, 159 "isDefault": true, 160 "updateEnabled": false, 161 "scheduledUpdateTime": "10:30", 162 "updateDuration": 1, 163 "defaultDimension": "1*2", 164 "supportDimensions": [ 165 "1*2", 166 "2*2", 167 "2*4", 168 "4*4" 169 ] 170 } 171 ] 172} 173``` 1746. Register the Extension page file in the **resource/base/profile/main_pages.json** file in the development view. 175 176```json 177{ 178 "src": [ 179 "pages/Index", 180 "pages/Extension" 181 ] 182} 183``` 184