1. ArkTS Card-Related Modules
1.1 form_config.json
The form_config.json file under the resources/base/profile/ directory is used to configure card layout, scheduled updates, dynamic/static settings, etc.
Refer to the official documentation for full field definitions: form_config.json Field Reference
This file is an array structure that allows multiple card configurations of different dimensions. The src field specifies the layout file path.
{
"forms": [
{
"name": "widget1",
"displayName": "$string:widget_display_name",
"description": "$string:widget_desc",
"src": "./ets/widget/pages/WidgetCard.ets",
"uiSyntax": "arkts",
"window": {
"designWidth": 720,
"autoDesignWidth": true
},
"colorMode": "auto",
"isDynamic": false,
"isDefault": true,
"updateEnabled": false,
"scheduledUpdateTime": "10:30",
"updateDuration": 1,
"defaultDimension": "2*4",
"supportDimensions": ["2*4"]
},
{
"name": "widget2",
"displayName": "$string:widget_display_name",
"description": "$string:widget_desc",
"src": "./ets/widget/pages/WidgetCard.ets",
"uiSyntax": "arkts",
"window": {
"designWidth": 720,
"autoDesignWidth": true
},
"colorMode": "auto",
"isDynamic": false,
"isDefault": false,
"updateEnabled": false,
"scheduledUpdateTime": "10:30",
"updateDuration": 1,
"defaultDimension": "4*4",
"supportDimensions": ["4*4"]
}
]
}
1.2 EntryFormAbility
Implement lifecycle methods of FormExtensionAbility in EntryFormAbility.ets:
import { formBindingData, FormExtensionAbility, formInfo } from '@kit.FormKit';
import { Want } from '@kit.AbilityKit';
export default class EntryFormAbility extends FormExtensionAbility {
onAddForm(want: Want) {
let formData = '';
return formBindingData.createFormBindingData(formData);
}
onCastToNormalForm(formId: string) {}
onUpdateForm(formId: string) {}
onFormEvent(formId: string, message: string) {}
onRemoveForm(formId: string) {}
onAcquireFormState(want: Want) {
return formInfo.FormState.READY;
}
};
1.3 Saving Card IDs Including Temporary Ones
-
onAddFormcan be called multiple times. -
onRemoveFormshould remove IDs for non-pinned cards.
import { preferences } from '@kit.ArkData';
private saveServiceCardId(want: Want): void { ... }
private deleteServiceCardId(formId: string): void { ... }
The core logic saves all card IDs in onAddForm, and filters them in onRemoveForm.
1.4 Getting IDs of Pinned Cards
The app provider can read the IDs of cards pinned to the home screen like this:
private getFormIds(): void {
let options = { name: 'CloudPhoneCard' };
preferences.removePreferencesFromCacheSync(getContext(this), options);
let formIds = preferences.getPreferencesSync(getContext(this), options);
Logger.debug(`EntryAbility getFormIds: ${formIds.getSync('formIds', '[]')}`);
}
1.5 Updating Network Images in Cards
Only dynamic cards support image updates. Network images must be downloaded to local storage first, and accessed using the memory:// prefix.
private async updateNetImg(formId: string, src: string): Promise<void> {
let fileName = 'file' + Date.now();
let tmpFile = this.context.getApplicationContext().tempDir + '/' + fileName;
let imgMap: Record<string, number> = {};
class FormDataClass {
updateImg: string = fileName;
formImages: Record<string, number> = imgMap;
}
let httpRequest = http.createHttp();
let data = await httpRequest.request(src);
if (data?.responseCode == http.ResponseCode.OK) {
try {
let imgFile = fileIo.openSync(tmpFile, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
imgMap[fileName] = imgFile.fd;
let writeLen = await fileIo.write(imgFile.fd, data.result as ArrayBuffer);
let formData = new FormDataClass();
let formInfo = formBindingData.createFormBindingData(formData);
await formProvider.updateForm(formId, formInfo);
fileIo.closeSync(imgFile);
} catch (error) {
Logger.debug(`Failed to write image: ${JSON.stringify(error)}`);
}
}
httpRequest.destroy();
}
Official reference: Image Update Guide
Top comments (0)