前篇传送门:

鸿蒙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,并使用订阅事件等方式进行传递信息
  }
}

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐