HarmonyOS 鸿蒙Next中添加卡片时需要对卡片进行数据初始化

HarmonyOS 鸿蒙Next中添加卡片时需要对卡片进行数据初始化 添加卡片时需要对卡片进行数据初始化,这个有指导吗?

5 回复

卡片数据初始化可以参考 卡片更新与数据交互-服务卡片

卡片创建及卡片配置参考 ArkTS卡片开发指导

更多关于HarmonyOS 鸿蒙Next中添加卡片时需要对卡片进行数据初始化的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


【问题背景】:如何在添加卡片的时候,对卡片数据进行初始化?

【解决思路】

1、全局卡片数据监听处理

在EntryFormAbility.ets中,实现FormExtensionAbility生命周期接口,其中在**onAddForm**的入参want中可以通过FormParam取出卡片的相关信息。

onAddForm(want: Want): formBindingData.FormBindingData {
  // 卡片使用方创建卡片时触发
  const formId: string = want.parameters[formInfo.FormParam.IDENTITY_KEY] as string; //卡片ID
  const formName: string = want.parameters[formInfo.FormParam.NAME_KEY] as string;  //卡片名称
  let obj: Record<string, string> = {
    'title': 'titleOnAddForm',
    'detail': 'detailOnAddForm'
  };
  //数据绑定
  let formData: formBindingData.FormBindingData = formBindingData.createFormBindingData(obj);
  return formData;
}

【官方文档——卡片生命周期】

2、单一卡片数据监听处理

在组件的aboutToAppear()处理即可

@Entry
@Component
struct CardTest {
  aboutToAppear(): void {
    
  }
}

兄弟,卡片初始化主要通过FormExtensionAbilityonAddForm()生命周期接口实现。

你可以看看下面的核心流程和代码示例:

1. 卡片初始化流程

  • 数据绑定:在onAddForm()中创建卡片数据对象,使用formBindingData.createFormBindingData()封装数据。
  • 异步处理:若需依赖异步数据(如网络请求),可先用空数据初始化卡片,再通过formProvider.updateForm()更新。

2. 代码示例

import { formBindingData, FormExtensionAbility, formInfo } from '@kit.FormKit';
import { Want } from '@kit.AbilityKit';
import { systemDateTime } from '@kit.BasicServicesKit';
import { FormData } from '../common/CommonData'; // 自定义数据类

export default class EntryFormAbility extends FormExtensionAbility {
  onAddForm(want: Want): formBindingData.FormBindingData {
    // 1. 校验参数
    if (!want?.parameters) {
      return formBindingData.createFormBindingData('');
    }

    // 2. 获取卡片标识
    const formId: string = want.parameters[formInfo.FormParam.IDENTITY_KEY] as string;
    const formName: string = want.parameters[formInfo.FormParam.NAME_KEY] as string;

    // 3. 构建初始数据
    if (formName === 'card_info_refresh') {
      const formData = new FormData(formId);
      formData.formTime = systemDateTime.getTime().toString(); // 设置初始时间
      return formBindingData.createFormBindingData(formData); // 返回绑定数据
    }
    return formBindingData.createFormBindingData('');
  }
}

3. 关键说明

  • 数据类定义:需自定义FormData类(示例中为CardListItemData结构),包含卡片所需字段(如formIdformTime)。
  • 异步场景:若初始化依赖数据库/网络,按以下步骤操作:
// 步骤1:先返回空数据
onAddForm(want: Want) {
  return formBindingData.createFormBindingData(''); 
}

// 步骤2:获取数据后更新卡片
import { formProvider } from '@kit.FormKit';
async fetchDataAndUpdate(formId: string) {
  const asyncData = await getNetworkData(); 
  formProvider.updateForm(formId, formBindingData.createFormBindingData(asyncData));
}

4. 注意事项

  • 参数校验:必须检查want.parameters是否存在,避免空指针异常。
  • 命名规范:使用formInfo.FormParam中的常量键(如IDENTITY_KEYNAME_KEY)获取参数。

在HarmonyOS Next中添加卡片时,数据初始化需在EntryFormAbility的onAddForm回调中完成。通过formBindingData.createFormBindingData方法创建数据对象,使用formProvider.setFormNext刷新数据至卡片。初始化数据可来源于本地存储或异步请求,需确保在卡片首次加载时完成数据绑定。

在HarmonyOS Next中,卡片数据初始化通常在onCreate生命周期中完成。可以通过以下方式实现:

  1. 使用FormBindingData初始化
import { FormBindingData, formBindingData } from '@kit.FormKit';

onCreate(want: Want): formBindingData.FormBindingData {
  // 构造初始数据
  let data: Record<string, Object> = {
    'title': '默认标题',
    'content': '初始内容'
  };
  return formBindingData.createFormBindingData(data);
}
  1. 异步数据初始化: 若需异步加载数据,可在onCreate中返回初始数据,同时在onAcquireFormState中更新:
async onAcquireFormState(want: Want): Promise<formInfo.FormState> {
  // 获取最新数据并更新卡片
  let newData = await this.fetchData();
  this.formProvider.updateForm(formId, newData);
  return formInfo.FormState.READY;
}
  1. 持久化数据初始化: 如需从本地存储初始化:
import { distributedData, distributedObject } from '@kit.DistributedDataKit';

let storage = distributedData.createDistributedObject({
  defaultValue: '初始值'
});

建议参考官方文档中"FormExtensionAbility"和"卡片数据管理"章节获取完整示例。初始化时注意处理异常情况,确保卡片始终能展示有效数据。

回到顶部