鸿蒙 NEXT 开发:服务卡片开发汇总
如何在 onAddForm 获取卡片标识(formId)
ts
import formInfo from "@ohos.app.form.formInfo";
export default class EntryFormAbility extends FormExtensionAbility {
// ...
onAddForm(want: Want) {
const formId = JSON.stringify(want.parameters[formInfo.FormParam.IDENTITY_KEY]);
// ...
}
// ...
}
加载远程图片
TIP
无法直接使用 Image
组件加载远程图片。
Image
组件通过入参 (memory://fileName)
中的 memory://
标识来进行远端内存图片显示,其中 fileName
需要和 EntryFormAbility
传递对象 ('formImages': {key: fd})
中的 key
相对应。
Image
组件通过传入的参数是否有变化来决定是否刷新图片,因此 EntryFormAbility
每次传递过来的 imgName
都需要不同,连续传递两个相同的 imgName
时,图片不会刷新。
文件使用完成后必须关闭,否则会出现内存泄漏问题。系统不会自动关闭文件,开发者可以使用 fs.closeSync
来关闭文件。
ts
import formInfo from "@ohos.app.form.formInfo";
import formBindingData from "@ohos.app.form.formBindingData";
import FormExtensionAbility from "@ohos.app.form.FormExtensionAbility";
import formProvider from "@ohos.app.form.formProvider";
import request from "@ohos.request";
import fs from "@ohos.file.fs";
export default class EntryFormAbility extends FormExtensionAbility {
// ...
onFormEvent(formId, message) {
// Called when a specified message event defined by the form provider is triggered.
console.info(`FormAbility onEvent, formId = ${formId}, message: ${JSON.stringify(message)}`);
let param: Record<string, string> = {
text: "刷新中...",
};
let formInfo: formBindingData.FormBindingData = formBindingData.createFormBindingData(param);
formProvider.updateForm(formId, formInfo);
// 注意:FormExtensionAbility在触发生命周期回调时被拉起,仅能在后台存在5秒
// 建议下载能快速下载完成的小文件,如在5秒内未下载完成,则此次网络图片无法刷新至卡片页面上
let netFile = "https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png"; // 需要在此处使用真实的网络图片下载链接
let tempDir = this.context.getApplicationContext().tempDir;
let fileName = "file" + Date.now();
let tmpFile = tempDir + "/" + fileName;
request
.downloadFile(this.context, {
url: netFile,
filePath: tmpFile,
enableMetered: true,
enableRoaming: true,
})
.then((task) => {
task.on("complete", () => {
let file: fs.File;
let fileInfo: Record<string, string | number> = {};
try {
file = fs.openSync(tmpFile);
fileInfo[fileName] = file.fd;
} catch (e) {
console.error(`openSync failed: ${JSON.stringify(e)}`);
}
class FormDataClass {
text: string = "Image: Bear" + fileName;
imgName: string = fileName;
loaded: boolean = true;
formImages: Record<string, string | number> = fileInfo;
}
let formData = new FormDataClass();
let formInfo = formBindingData.createFormBindingData(formData);
formProvider
.updateForm(formId, formInfo)
.then(() => {})
.catch((error) => {});
});
task.on("fail", (err: number) => {
let param: Record<string, string> = {
text: "刷新失败",
};
let formInfo: formBindingData.FormBindingData = formBindingData.createFormBindingData(param);
formProvider.updateForm(formId, formInfo);
});
})
.catch((err) => {});
}
// ...
}
ets
let storageWidgetImageUpdate = new LocalStorage();
@Entry(storageWidgetImageUpdate)
@Component
struct WidgetImageUpdateCard {
@LocalStorageProp('loaded') loaded: boolean = false;
@LocalStorageProp('imgName') imgName: ResourceStr = '';
build() {
if (this.loaded) {
Column() {
Image('memory://' + this.imgName)
.objectFit(ImageFit.Contain)
.width('100%').height('100%')
}.width('100%').height('100%')
} else {
Column() {
Row() {
Button('update')
.width(120)
.height(32)
.margin({ top: '30%', bottom: '10%' })
.borderRadius(16)
.onClick(() => {
postCardAction(this, {
action: 'message',
params: {
info: 'refreshImage'
}
});
})
}.width('100%').height('40%')
.justifyContent(FlexAlign.Center)
}.width('100%').height('100%')
}
}
}