鸿蒙ArkTS中的小组件与主应用数据传递
如果API受限,可以使用MMKV等全局存储方式,因为小组件与主应用不在同一个进程中,所以数据的保存要设置为跨进程可访问。更新小组件数据前,要获取已发布的小组件id,在API20中,支持如下方法。(这里的StorageUtils使用的腾讯MMKV,很好用)小组件点击事件,如下为携带参数并跳转至主应用。鸿蒙ArkTS中的小组件-CSDN博客。本篇讲实际开发中的数据保存与传递方案。保存卡片id用于更新数
·
前篇传送门:
鸿蒙ArkTS中的小组件-CSDN博客
https://blog.csdn.net/sywmkj2024/article/details/155782964?spm=1011.2124.3001.6209本篇讲实际开发中的数据保存与传递方案
更新小组件数据前,要获取已发布的小组件id,在API20中,支持如下方法
import { formProvider } from '@kit.FormKit';
//API20支持,用于获取当前已经使用的小组件
formProvider.getPublishedRunningFormInfos()
formProvider.getPublishedRunningFormInfoById('这是id')
如果API受限,可以使用MMKV等全局存储方式,因为小组件与主应用不在同一个进程中,所以数据的保存要设置为跨进程可访问
(这里的StorageUtils使用的腾讯MMKV,很好用)
/**
* 存储 formId
* @param formId
*/
static onUpdateForm(formId: string) {
let formIdsString = StorageUtils.getString(Consts.WIDGET_IDS)
let formIdsArr: string[] = []
if (formIdsString) {
formIdsArr = JSON.parse(formIdsString) as string[]
if (formIdsArr.indexOf(formId) === -1) {
formIdsArr.push(formId)
StorageUtils.putString(Consts.WIDGET_IDS, JSON.stringify(formIdsArr))
}
} else {
formIdsArr.push(formId)
StorageUtils.putString(Consts.WIDGET_IDS, JSON.stringify(formIdsArr))
}
}
/**
* 删除 formId
* @param formId
*/
static onRemoveForm(formId: string) {
let formIdsString = StorageUtils.getString(Consts.WIDGET_IDS)
if (formIdsString) {
let formIdsArr = JSON.parse(formIdsString) as string[]
const index = formIdsArr.indexOf(formId)
if (index !== -1) {
formIdsArr.splice(index, 1)
StorageUtils.putString(Consts.WIDGET_IDS, JSON.stringify(formIdsArr))
}
}
}
//这里是StorageUtils的一部分,MMKV.MULTI_PROCESS_MODE)为跨进程
import { MMKV, MMKVHandler, MMKVLogLevel } from '@tencent/mmkv'
static getString(key: string, defaultValue?: string): string | undefined {
return MMKV.defaultMMKV(MMKV.MULTI_PROCESS_MODE).decodeString(key, defaultValue)
}
static putString(key: string, value: string): boolean {
return MMKV.defaultMMKV(MMKV.MULTI_PROCESS_MODE).encodeString(key, value)
}
保存卡片id用于更新数据
static updateFormsByModel(model: WidgetParamModel) {
const formMsg: formBindingData.FormBindingData = formBindingData.createFormBindingData(model)
const formIdsString = StorageUtils.getString(Consts.WIDGET_IDS)
const formIdArr = JSON.parse(formIdsString) as string[]
console.log(`updateForm formId: ${formIdsString} , updateData : ${JSON.stringify(formMsg)}`)
formIdArr.forEach((itemId) => {
formProvider
.updateForm(itemId, formMsg)
.then(() => {
console.log(`updateForm success formId: ${itemId}`)
})
.catch((error: BusinessError) => {
console.log(`updateForm failed: ${JSON.stringify(error)}`)
})
})
}
小组件点击事件,如下为携带参数并跳转至主应用
//小组件中,如下设置可以打开主应用
jumpToApp(item: WidgetButton) {
postCardAction(this, {
action: FormCarAction.ROUTER,
abilityName: ENTRY_ABILITY,
params: item
})
}
//在主应用的onCreate/onNewWant(冷启动/热启动)中进行参数解析
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
...
this.handleParams(want)
}
onNewWant(want: Want, _launchParam: AbilityConstant.LaunchParam): void {
...
this.handleParams(want)
}
handleParams(want: Want) {
if (want?.parameters?.params) {
let params = JSON.parse(want.parameters.params as string) as WidgetButton
//TODO 在这里进行解析的操作,比如跳转至指定index,并使用订阅事件等方式进行传递信息
}
}
更多推荐

所有评论(0)