HarmonyOS7 普通卡片组件也别忽略,动态广告要和列表内容配合起来看

项目源码地址:https://gitcode.com/HarmonyOS_Samples/DynamicComponent

这个项目叫动态组件,很多人就只盯着广告节点。

但列表流广告要成立,普通内容也得稳定显示。否则广告再动态,列表本身乱了也没意义。

这篇看 CardComponent.etsTypeCasting.ets,讲普通卡片怎么显示,以及资源字符串怎么取出来。

普通卡片从哪里来

MainPage.ets 里,非广告数据走这段:

CardComponent({ cardData: item });

也就是说,只要 item.isAdCard()false,页面就创建普通卡片组件。

广告和普通卡片是同一个列表里的两种渲染结果。

CardComponent 接收 CardData

CardComponent.ets 开头是这样:

@Component
export struct CardComponent {
  cardData?: CardData;
  @State private cardTitle: string = '';
  @State private cardAbstract: string = '';
}

它接收一个 cardData,然后用两个状态保存标题和摘要。

为什么标题和摘要不是直接写死?

因为它们来自资源文件,需要通过工具函数转成字符串。

A hand-drawn doodle illustration on pure white pap

aboutToAppear 里准备标题和摘要

组件出现前,会执行:

aboutToAppear() {
  resourceToString(this.getUIContext(), $r('app.string.text_card_title')).then(value => {
    this.cardTitle = value + this.cardData!.getId();
  })
  resourceToString(this.getUIContext(), $r('app.string.text_card_abstract')).then(value => {
    this.cardAbstract = value + this.cardData!.getId();
  })
}

这段代码做了两件事:

先读取资源里的标题前缀和摘要前缀。

再拼上当前卡片的 id

所以列表里每张普通卡片都有不同的标题和摘要,看起来像一批模拟内容。

resourceToString 是资源转换工具

工具函数在 entry/src/main/ets/common/TypeCasting.ets

export async function resourceToString(uiContext: UIContext, source: Resource): Promise<string> {
  return uiContext.getHostContext()!.resourceManager.getStringValue(source.id).catch((error: Error) => {
    let err = error as BusinessError
    if (err.code) {
      hilog.error(0x0000, 'ImperativeView', 'Failed to get host context. Cause: %{public}s', JSON.stringify(err) ?? '');
    }
    return '';
  });
}

小白可以先不纠结 BusinessErrorhilog

重点是这句:

uiContext.getHostContext()!.resourceManager.getStringValue(source.id)

它通过 UIContext 拿到宿主上下文,再通过 resourceManager 获取字符串资源。

为什么要异步 then

resourceToString() 返回的是 Promise<string>

所以 CardComponent 里用:

resourceToString(...).then(value => {
  this.cardTitle = value + this.cardData!.getId();
})

等资源字符串拿到了,再更新 @State

@State 更新后,卡片文本会刷新。

这就是普通声明式组件常见的状态更新方式。

卡片 UI 是怎么搭出来的

A hand-drawn doodle illustration on pure white pap

build() 里核心结构是:

Column() {
  Row() {
    Image($r('app.media.SampleImage'))
      .width($r('app.string.card_image_size'))
      .height($r('app.string.card_image_size'))

    Column() {
      Text(this.cardTitle)
      Text(this.cardAbstract)
    }
    .layoutWeight(1)
  }
}

左边是缩略图,右边是标题和摘要。

layoutWeight(1) 表示右侧文本区域尽量占用剩余空间。

这是很常见的列表卡片布局。

文本溢出处理也值得学

标题和摘要都有这样的设置:

.maxLines(1)
.textOverflow({ overflow: TextOverflow.Ellipsis })

意思是最多显示一行,超出部分用省略号。

这在列表组件里非常常见。因为卡片宽度有限,真实标题可能很长,如果不处理,布局容易被撑乱。

普通卡片和动态广告的区别

现在可以对比一下:

普通卡片:

CardComponent({ cardData: item });

动态广告:

NodeContainer(getAdNodeController(this.getUIContext(), item.getId()))

普通卡片直接声明组件。

动态广告先创建 Controller,再由 Controller 返回节点。

这就是这个项目最核心的对比。

为什么这篇也重要

如果你只学动态广告,不看普通卡片,很容易误以为整个列表都应该动态化。

其实不是。

项目的设计很克制:普通内容用普通组件,只有广告这种运行时变化更强的模块才用动态节点。

这才是比较合理的工程选择。

收个尾

动态组件不是替代普通组件,而是补充普通组件。

这个项目里,CardComponent 负责稳定的普通内容,NodeContainer + AdController 负责运行时决定的广告内容。两者放在同一个 LazyForEach 里,才构成完整的列表流广告案例。

下一篇我们进入 JSON 动态页面。那一部分不再是局部广告,而是把整页 UI 都交给数据来描述。

内容概要:本文介绍了一项创新性未发表的研究,即利用多元宇宙优化算法(Multiverse Optimizer, MVO)对分时电价下的需求响应与综合能源系统调度问题进行建模与求解,旨在实现能源系统的经济性、高效性与可持续性运行。该研究构建了包含多种能源设备(如光伏、风机、燃气轮机、储能系统等)及可调节负荷的综合能源系统模型,充分考虑了用户侧的需求响应行为在分时电价机制下的响应特性,通过MVO算法对系统运行成本、能源利用率、碳排放等多目标进行协同优化,实现了日前调度计划的智能决策。研究还提供了完整的MATLAB代码实现,便于研究人员复现实验、验证算法性能,并为进一步研究提供可靠的仿真基础。; 适合人群:具备一定电力系统、优化算法及MATLAB编程基础的科研人员、研究生以及从事能源互联网、综合能源系统规划与运行的技术工程师。; 使用场景及目标:① 学习并掌握多元宇宙优化算法在复杂能源系统调度中的具体应用方法;② 研究分时电价机制如何通过需求响应引导用户参与电网互动,实现削峰填谷;③ 实现综合能源系统(IES)中冷、热、电、气等多种能源的协同优化调度,以降低运行成本、提高新能源消纳能力系统可靠性;④ 为相关领域的学术研究提供可复现的代码实例仿真平台。; 阅读建议:此资源以MATLAB代码为核心载体,深入剖析了算法应用与系统建模的全过程。建议读者在学习时,不仅应关注代码的实现细节,更要理解其背后的数学模型、优化目标设定约束条件的物理意义。建议结合文档中的模型描述,逐步调试代码,观察不同参数场景下的优化结果,从而深刻掌握综合能源系统优化调度的设计思想与关键技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值