HarmonyOS鸿蒙Next中uni-app实现卡片示例

HarmonyOS鸿蒙Next中uni-app实现卡片示例

场景介绍

uni-app实现卡片示例是实用工具类应用的高频使用场景之一,如用户可以直接点击卡片页面的按钮,从而执行对应的方法。 本示例使用postCardAction接口实现拉起应用到后台,并执行相应的方法。

效果预览

alt

实现思路

  1. FormExtensionAbility为卡片扩展模块,提供卡片创建、销毁、刷新等生命周期回调。
import { formBindingData, FormExtensionAbility, formInfo } from '@kit.FormKit';
import { Want } from '@kit.AbilityKit';
import { FormData } from '../common/model/FormData';
import { FormInfo } from '../common/model/FormInfo';
import Logger from '../common/utils/Logger';
import { PreferencesUtil } from '../common/utils/PreferencesUtil';

const TAG: string = 'EntryFormAbility';

export default class EntryFormAbility extends FormExtensionAbility {
  onAddForm(want: Want): formBindingData.FormBindingData {
    // Called to return a FormBindingData object.
    if (!want || !want.parameters) {
      return formBindingData.createFormBindingData('');
    }

    let formId = want.parameters['ohos.extra.param.key.form_identity'] as string;
    let formDimension = want.parameters['ohos.extra.param.key.form_dimension'] as string;
    let formName = want.parameters['ohos.extra.param.key.form_name'] as string;

    let formInfo = new FormInfo();
    formInfo.formId = formId;
    formInfo.formDimension = formDimension;
    formInfo.formName = formName;
    Logger.info(TAG, `onAddForm formInfo: ${JSON.stringify(formInfo)}`);
    let util = PreferencesUtil.getInstance();
    let preferences = util.getPreferences(this.context);
    // Save form id using preferences.
    util.addFormId(preferences, formId);

    if (formName === 'DeviceInfo2x4Widget') {
      let formData = new FormData(formId);
      formData.batterySOCInfo = preferences.getSync('batterySOCInfo', 0) as number;
      formData.storageInfo = preferences.getSync('storageInfo',
        `${this.context.resourceManager.getStringSync($r('app.string.notFoundStorage').id)}`) as string;
      formData.totalStorageGB = preferences.getSync('totalStorageGB', 0) as number;
      formData.usedStorageGB = preferences.getSync('usedStorageGB', 0) as number;
      formData.freeStorageGB = preferences.getSync('freeStorageGB', 0) as number;
      formData.marketName = preferences.getSync('marketName',
        `${this.context.resourceManager.getStringSync($r('app.string.notFoundMarketName').id)}`) as string;
      formData.brand = preferences.getSync('brand',
        `${this.context.resourceManager.getStringSync($r('app.string.notFoundBrand').id)}`) as string;

      let formInfo: formBindingData.FormBindingData = formBindingData.createFormBindingData(formData);
      return formInfo;
    }

    return formBindingData.createFormBindingData('');
  }

  onCastToNormalForm(formId: string) {
    // Called when the form provider is notified that a temporary form is successfully
    // converted to a normal form.
  }

  onUpdateForm(formId: string) {
    // Called to notify the form provider to update a specified form.
  }

  onFormEvent(formId: string, message: string) {
    // Called when a specified message event defined by the form provider is triggered.
  }

  async onRemoveForm(formId: string): Promise<void> {
    // Called to notify the form provider that a specified form has been destroyed.
    PreferencesUtil.getInstance().removeFormId(this.context, formId);
  }

  onAcquireFormState(want: Want) {
    return formInfo.FormState.READY;
  }
};
  1. 拉起应用至后台时更新卡片:在卡片页面中注册onClick()点击事件,在回调中调用postCardAction接口,action参数选择call并配置需要调用的方法和传递数据。
postCardAction(this, {
  action: 'call',
  abilityName: 'MyEntryAbility',
  params: {
    formId: this.formId,
    method: 'updateForm2x4Call',
  }
});
  1. 应用在后台,触发UIAbility中对应的同名方法。
// method方法与参数
updateBatteryInfoCall = (data: rpc.MessageSequence) => {}

// 在UIAbility的onCreate()中进行监听
this.callee.on('updateBatteryInfoCard', this.updateBatteryInfoCall);

约束与限制

  • 本示例支持API Version 20 Release及以上版本。
  • 本示例支持HarmonyOS 6.0.0 Release SDK及以上版本。
  • 本示例需要使用HBuilderX 4.87、DevEco Studio 6.0.0 Release及以上版本进行编译运行。

工程目录

├─App.vue                                   // 应用配置,用来配置App全局样式以及监听、应用生命周期
├─index.html                                // 用于web加载渲染的root节点
├─main.js                                   // Vue初始化入口文件
├─manifest.json                             // 应用相关配置
├─pages.json                                // 配置页面路由、导航条、选项卡等页面类信息
├─uni.scss                                  // 内置的常用样式变量
├─harmony-configs                           // harmony工程定制化配置目录,每次编译执行HBuilderX都会检查这个目录,如果目录不存在则会自动创建。
│  └─entry
│      └─src
│          └─main
│              └─module.json5               // 应用配置文件,配置requestPermissions等信息
├─pages
│  └─index
│      └─index.vue                          // 首页
├─static                                    // 静态资源文件
└─uni_modules                               // 插件目录,用于存放uni-app的插件

参考文档

FormExtensionAbility postCardAction 卡片更新与数据交互 通过router或call事件刷新卡片内容

代码示例

详情见 uni-app实现卡片示例


更多关于HarmonyOS鸿蒙Next中uni-app实现卡片示例的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

感谢大佬分享

更多关于HarmonyOS鸿蒙Next中uni-app实现卡片示例的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS NEXT中,uni-app通过集成Form Kit实现卡片。需在manifest.json中配置form权限和卡片模板路径,使用FormExtensionAbility定义卡片生命周期。前端通过<form>组件绑定数据,调用updateForm方法刷新UI。卡片布局需使用CSS弹性布局适配多尺寸。

在HarmonyOS Next中,uni-app实现卡片的核心基于FormExtensionAbility扩展模块和postCardAction接口。从你提供的示例看,主要流程如下:

  1. 卡片生命周期管理:通过FormExtensionAbilityonAddForm回调创建卡片,利用PreferencesUtil持久化存储卡片ID及相关数据(如电池信息、存储信息),并在onRemoveForm中清理。

  2. 卡片与应用的交互:卡片页面通过postCardAction({ action: 'call', abilityName: 'MyEntryAbility', params: { formId, method: 'updateForm2x4Call' } })将请求发送至应用后台。UIAbility通过callee.on注册同名方法(如updateBatteryInfoCall)进行监听,从而执行数据更新逻辑。

  3. 项目结构:示例工程包含harmony-configs目录用于定制化配置(如module.json5),uni_modules存放插件,pages为前端页面,整体遵循uni-app标准目录结构。

该方案依赖API Version 20 Release及以上SDK,需在HBuilderX 4.87或DevEco Studio 6.0.0 Release环境中编译。更多细节可参考官方提供的完整代码仓库。

回到顶部