• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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