在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

鸿蒙 Next 小红书封面生成器 App 开发实战:6 套模板 + 实时预览 + 装饰系统

作者:duluo
SDK 版本:HarmonyOS API 24 (Next)
开发工具:DevEco Studio 5.0+
语言框架:ArkTS + ArkUI
字数:约 10000 字


目录

  1. 引言:封面是内容的第一印象
  2. 产品概念与三 Tab 架构
  3. CoverTemplate 数据模型
  4. 编辑 Tab:输入与实时预览
  5. 模板 Tab:6 种风格选择
  6. 装饰系统与字体大小
  7. 预览与保存
  8. 历史记录管理
  9. 视觉设计:粉白柔美
  10. ArkTS 兼容性记录
  11. 第三十七款 App 全景回顾
  12. 结语

1. 引言:封面是内容的第一印象

1.1 封面图的价值

在内容平台(小红书、公众号、抖音)上,封面图是用户决定是否点击的第一要素。一张好的封面图可以提升 2-3 倍的点击率。但大多数创作者并不是设计师——他们需要一个工具来快速生成美观的封面。

小红书封面生成器 App 的定位就是:让不懂设计的创作者也能生成专业级封面。用户只需要输入标题、选择模板、调整样式——三步就能生成一张可用的封面图,整个过程不超过 10 秒。

为什么不做成网页工具而是 App:封面生成器需要实时预览和流畅的交互体验——输入文字时预览框即时更新、切换模板时背景色立即变化。这些交互在原生 App 中比在网页中更流畅。同时,作为手机 App,用户可以在移动端随时生成封面,不需要打开电脑。

1.2 小红书封面的特点

小红书封面与其他平台的封面有显著不同:

抖音封面:视频截图为主,文字简短,横屏 16:9
公众号封面:横版图片+标题文字,横屏
小红书封面:竖版比例(3:4),渐变色背景+居中大标题

小红书的竖版比例(3:4)决定了封面的设计逻辑——文字需要居中排列,背景需要足够的视觉空间。渐变色背景在小红书封面上非常常见,因为它比纯色背景更有层次感,又不会像图片背景那样分散注意力。本 App 的封面预览框虽然使用了 1:1 的方形比例(200×200px 迷你预览和 320×320px 全屏预览),但所有设计元素(居中标题、渐变色背景、装饰线)都是按照小红书封面的 3:4 竖版逻辑排列的。

1.3 从零到封面的三步流程

第 1 步:输入标题(3 秒)
    输入封面主标题和副标题
    在顶部的实时预览框中即时看到效果

第 2 步:选择模板(1 秒)
    从 6 套配色模板中选择一套
    预览框的背景色和文字色立即更新

第 3 步:调整样式(2 秒)
    选择字体大小(大/中/小)
    选择装饰(横线/圆点)
    点击"预览"查看全屏效果

整个过程不超过 10 秒,用户不需要打开 Photoshop 或 Canva,不需要调整任何颜色数值——模板系统将所有设计决策封装为"选择"而不是"配置"。

与传统封面设计工具的对比

步骤 传统方式(Canva) 本 App
创建画布 选择尺寸(3:4 竖版) 自动 3:4
添加背景 选择颜色/图片 自动模板配色
输入文字 添加文本框 → 输入 → 调整字体 直接输入
调整样式 手动调整颜色/大小/位置 选择字号和装饰
导出 下载图片 保存到历史

传统方式需要 10+ 步和一定的设计经验,本 App 只需要 3 步且完全不需要设计经验。这种"极简"不是通过减少功能实现的,而是通过将设计决策封装到模板中实现的——用户不需要选择"用什么颜色",只需要选择"哪个模板"。颜色、渐变色、文字色、强调色都已经在模板中预定义了。

1.4 功能清单

功能清单:
├── F1: 封面标题输入(实时渲染到预览框)
├── F2: 副标题输入(可选,自动调整间距)
├── F3: 6 套配色模板(渐变背景 + 文字色 + 强调色)
├── F4: 3 档字体大小(大 28px / 中 22px / 小 18px)
├── F5: 5 种装饰(无/横线/圆点/方框/斜线)
├── F6: 编辑区实时迷你预览(200px 高)
├── F7: 全屏预览弹窗(320px 封面展示)
├── F8: 保存到历史记录(最多 20 条)
├── F9: 历史浏览与删除
└── F10: 一键复制标题

2. 产品概念与三 Tab 架构

2.1 三 Tab 设计

│ Tab 0: ✍️ 编辑 │ Tab 1: 🎨 模板 │ Tab 2: 📚 历史 │

三个 Tab 对应"输入→选择→管理"的完整工作流:

Tab 功能 核心交互
编辑 输入标题 + 实时预览 + 样式调节 文字输入、选项点击
模板 6 套风格切换 点击卡片选中
历史 最近 20 条记录管理 浏览、删除

Tab 布局与同类 App 的对比:封面生成器的三 Tab 布局与"博客一键转图文"(编辑→模板→记录)几乎相同。这是内容创作工具的标准 Tab 布局——"输入→选择→管理"的工作流在不同 App 之间具有高度一致性。

2.2 Header 设计

@Builder
buildHeader() {
  Row() {
    Text('📕 封面生成器')
    Text(this.getHeaderSub())
    if (this.activeTab === 0 && this.title.length > 0) {
      Text('👁️ 预览').onClick(() => { this.showPreview = true; })
    }
  }
}

Header 右侧的预览按钮只在编辑 Tab 且有标题时显示——这是一个上下文感知的交互设计,用户填写标题后可以一键预览封面效果。

Header 的响应式设计:标题和副标题在 Header 中组合显示。编辑 Tab 的副标题是"输入标题 · 选择模板 · 生成封面",提示用户当前的操作流。模板 Tab 的副标题是"6 种风格 · 一键切换",强调模板的便捷性。历史 Tab 的副标题是"最近生成的封面",为空的列表提供上下文。三个副标题分别对应三个 Tab 的核心价值——“操作”、“选择”、“回顾”。

2.3 @State 状态变量

变量 类型 更新频率 用途
activeTab number Tab 切换
title string 高(每次输入) 封面标题
subtitle string 副标题
selectedTpl number 选中模板 ID
fontSize number 字体大小索引(0-2)
decoration number 装饰类型索引(0-4)
showPreview boolean 预览弹窗显隐
history string[] 历史记录数组

8 个 @State 变量——处于 36 款 App 的中间水平。其中 5 个(title/subtitle/selectedTpl/fontSize/decoration)直接控制预览框的渲染内容,这些变量的变化会触发 buildMiniPreview() 的重新渲染。其余 3 个(activeTab/showPreview/history)控制导航、弹窗和数据管理,不影响预览内容。

8 个变量的分类

内容状态:title, subtitle(用户输入的内容)
样式状态:selectedTpl, fontSize, decoration(用户选择的样式)
UI 状态:activeTab, showPreview(页面导航)
数据状态:history(持久化记录)

3. CoverTemplate 数据模型

interface CoverTemplate {
  id: number;
  name: string;        // 模板名(如"奶油粉")
  bgColors: string[];  // 背景渐变(2 色,from/to)
  fontColor: string;   // 文字颜色
  accentColor: string;  // 强调色(装饰用)
  style: string;       // 风格描述
}

3.1 6 套模板参数

ID 名称 背景渐变 文字色 强调色 风格
1 奶油粉 #FFF5F7#FFE0E8 #2D1B1B #FF6B8A 柔美
2 抹茶绿 #F0FFF4#D4EDDA #1B2D1B #38A169 清新
3 奶茶棕 #FFF8F0#F0E0D0 #2D1B1B #B8866B 温暖
4 雾霾蓝 #F0F8FF#DDE8F5 #1B1B2D #5A8DB6 知性
5 高级黑 #1A1A1A#2D2D2D #FFFFFF #FFD700 极简
6 薰衣草 #F8F0FF#EDE0F5 #2D1B2D #9B6BB5 浪漫

模板配色的设计原则:每个模板使用相邻色相的 2 色渐变(如奶油粉:粉色→浅粉),而不是对比色相(如粉→绿)。相邻色相的渐变更柔和,不会在封面中产生视觉冲突。文字颜色使用深色(在浅色背景上)或白色(在深色背景上),确保可读性。

6 套模板的覆盖范围

模板 适合内容类型 典型笔记标题
奶油粉 美妆、穿搭、日常生活 “春季穿搭合集”
抹茶绿 读书、学习、效率提升 “30 天读书计划”
奶茶棕 美食、探店、烘焙 “周末 brunch 探店”
雾霾蓝 职场、知识、干货分享 “写给职场新人的建议”
高级黑 科技、观点、文案 “2024 数码产品推荐”
薰衣草 情感、文艺、手账 “写给十年后的自己”

每套模板都对应一个内容类目,用户可以根据笔记的主题选择最合适的模板。模板的命名也采用了用户熟悉的命名方式(奶油粉、抹茶绿等),而不是"模板 A"、“模板 B”——熟悉的命名让选择更直观。

模板的扩展性TEMPLATES 是一个常量数组,添加新模板只需要添加一条记录即可——不需要修改任何 UI 代码。如果需要扩展模板数量,只需要在数组中添加新的 CoverTemplate 对象,ForEach 会自动渲染新的模板卡片。这是"数据驱动 UI"的典型应用——UI 结构由数据决定,数据变化时 UI 自动适应。


4. 编辑 Tab:输入与实时预览

4.1 编辑 Tab 布局

┌────────────────────────────────┐
│        封面实时预览             │  ← 200px 高
│     (根据输入实时渲染)         │
├────────────────────────────────┤
│  [ 输入封面标题 ]               │  ← TextInput
│  [ 副标题(可选) ]             │  ← TextInput
│                                │
│  📐 标题大小                    │
│  [大标题] [中标题] [小标题]    │  ← 3 档选择
│                                │
│  🎀 装饰                       │
│  [无] [横线] [圆点] [方框] [斜线] │  ← 5 种选择
└────────────────────────────────┘

4.2 实时预览

@Builder
buildMiniPreview() {
  Column() {
    if (this.decoration === 1) {
      Column().width(40).height(3).backgroundColor(this.getTplAccent())
    }
    if (this.title.length > 0) {
      Text(this.title).fontSize(this.getFontSize())
        .fontColor(this.getTplFontColor()).fontWeight(FontWeight.Bold)
    } else {
      Text('输入标题').fontSize(18).fontColor(C.textMuted).opacity(0.5)
    }
    if (this.subtitle.length > 0) {
      Text(this.subtitle).fontSize(13).fontColor(this.getTplFontColor()).opacity(0.7)
    }
    if (this.decoration === 2) {
      // 三个圆点装饰
    }
  }
  .linearGradient({
    direction: GradientDirection.Bottom,
    colors: [[this.getTplBg0(), 0], [this.getTplBg1(), 1]]
  })
}

实时预览的渲染时机:每次 titlesubtitlefontSizedecorationselectedTpl 任一变化时,预览框都会重新渲染。ArkTS 的响应式系统会自动检测 @State 变量的变化并触发对应的组件更新。

标题为空时显示灰色的"输入标题"占位文字(opacity 0.5),提示用户输入。这个设计在页面加载时提供了一个视觉锚点——用户能看到"这里会显示标题",而不是看到一个空的白色区域。

4 个 getter 方法getTplFontColor()getTplAccent()getTplBg0()getTplBg1()getTemplate() 方法中提取单个字段值,避免了在 @Builder 中声明 const tpl 变量。每个 getter 方法的结构相同:调用 getTemplate 检查是否为空返回对应字段提供默认值。这种"查判返默"的四步模式是 @Builder 中安全获取数据的标准写法。4 个 getter 虽然比 1 个 const 变量多了 3 倍的方法调用,但在 ArkTS 中这是唯一正确的写法——因为 @Builder 中不能声明变量。而且这 4 个 getter 的执行开销极低(每次只遍历一次 6 个元素的数组),不会对性能产生任何影响。


5. 模板 Tab:6 种风格选择

@Builder
buildTemplateCard(tpl: CoverTemplate) {
  Column() {
    Row() {
      // 左:色块预览(60×60 渐变方块 + "T" 文字)
      Column() { Text('T').fontSize(20).fontColor(tpl.fontColor) }
        .width(60).height(60).borderRadius(12)
        .linearGradient({ direction: GradientDirection.Bottom,
          colors: [[tpl.bgColors[0], 0], [tpl.bgColors[1], 1]] })

      // 中:名称 + 风格描述
      Column() {
        Text(tpl.name).fontSize(16).fontColor(C.text).fontWeight(FontWeight.Medium)
        Text(tpl.style + '风格').fontSize(11).fontColor(C.textLight)
      }.margin({ left: 14 }).layoutWeight(1).alignItems(HorizontalAlign.Start)

      // 右:选中标记
      if (this.selectedTpl === tpl.id) { Text('✓').fontSize(20).fontColor(C.primary) }
    }
  }
  .border({ width: this.selectedTpl === tpl.id ? 2 : 0, color: C.primary })
  .onClick(() => { this.selectedTpl = tpl.id; })
}

模板卡片的选中态:选中后显示 2px 粉色边框 + ✓ 标记。未选中时无边框无标记。边框宽度的切换通过三元表达式实现——选中时 2px,未选中时 0px。

模板 Tab 的交互细节:点击模板卡片会切换 selectedTpl 的值,同时编辑 Tab 中预览框的背景色和文字色会立即变化。但用户不会自动跳转到编辑 Tab——他们可以继续浏览其他模板,预览框的变化作为"后台预览"存在。当用户满意时,点击底部 Tab 切换到编辑 Tab 查看详细信息。

模板与内容的解耦:模板只控制视觉样式(背景色、文字色、强调色),不影响用户输入的标题和副标题内容。这意味着用户可以在不丢失已输入内容的前提下自由切换模板——这在 UX 设计中称为"无损切换"。


6. 装饰系统与字体大小

6.1 三种装饰效果

索引 名称 实现代码 预览效果
0 纯文字封面
1 横线 Column().width(40).height(3) 使用强调色 标题上方一条 3px 横线
2 圆点 3 个 6px 圆点排列 标题下方三个小圆点
3 方框 预留接口(当前未实现)
4 斜线 预留接口(当前未实现)

装饰的条件渲染buildMiniPreview() 中使用 if (this.decoration === 1)if (this.decoration === 2) 条件判断来决定是否渲染装饰元素。这种条件渲染方式确保未选中的装饰不会占用渲染资源。

强调色的使用:横线和圆点都使用 this.getTplAccent() 作为颜色——即当前模板的强调色。在奶油粉模板中横线是粉色,在抹茶绿模板中横线是绿色。强调色每次随模板切换而变化,用户不需要手动匹配颜色。

6.2 三档字号映射

fontSize 索引 0 → 编辑区 28px / 预览区 36px
fontSize 索引 1 → 编辑区 22px / 预览区 30px
fontSize 索引 2 → 编辑区 18px / 预览区 26px

编辑区字号 = this.getFontSize()  // 28/22/18
预览区字号 = this.getFontSize() + 8  // 36/30/26

预览区的字号比编辑区大 8px,因为预览区的展示面积更大(全屏弹窗 320px vs 编辑区小预览 200px),更大的字号能更好地填充封面空间。


7. 预览与保存

@Builder
buildPreviewOverlay() {
  Column() {
    Blank().onClick(() => { this.showPreview = false; })
    Column() {
      // 封面大图(320px 高)
      Column() {
        Text(this.title).fontSize(this.getFontSize() + 8)
          .fontColor(this.getTplFontColor()).fontWeight(FontWeight.Bold)
        if (this.subtitle.length > 0) {
          Text(this.subtitle).fontSize(15).fontColor(this.getTplFontColor()).opacity(0.7)
        }
        Text('小红书').fontSize(10).fontColor(this.getTplFontColor()).opacity(0.3)
      }
      .width('100%').height(320).borderRadius(16)
      .linearGradient({ direction: GradientDirection.Bottom,
        colors: [[this.getTplBg0(), 0], [this.getTplBg1(), 1]] })
      .justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center)

      // 操作
      Row() {
        Button('💾 保存').onClick(() => { this.saveToHistory(); })
        Button('📋 复制').onClick(() => { promptAction.showToast(...) })
      }
    }
  }
}

预览弹窗中的"保存"按钮会调用 saveToHistory() 将当前封面信息保存到 history 数组。"复制"按钮使用 promptAction.showToast 模拟复制操作。

全屏预览的排版逻辑:预览弹窗中的封面展示区域为 320px 高的方形区域。标题使用 this.getFontSize() + 8 来放大字号(比编辑区大 8px),副标题固定 15px 且半透明(opacity(0.7)),底部版权文字"小红书"使用 10px 极低透明度(opacity(0.3))。文字大小从标题到副标题到版权逐步递减(36→15→10px),透明度逐步递增(100%→70%→30%),形成了清晰的视觉层级。

保存与复制的分工

按钮 激励色 功能 使用场景
💾 保存到相册 粉色(主色) 保存封面记录到历史列表 确定封面后存档
📋 复制标题 浅灰色 复制标题文字到剪贴板 写笔记时使用

两个按钮的分工明确——"保存"用于持久化封面记录,"复制"用于快速复用标题文字。粉色按钮是主要操作(保存),灰色按钮是次要操作(复制)。这个"一主一次"的按钮设计模式在本系列的多款 App 中反复使用。


8. 历史记录管理

saveToHistory(): void {
  const entry = '📕 ' + this.title + ' · ' + this.getTemplate().name;
  this.history = [entry, ...this.history].slice(0, 20);
}

头插法:最新生成的封面显示在列表顶部。上限 20 条:超过 20 条时自动丢弃最旧的记录。可删除:每条记录右侧有 🗑️ 按钮,点击后从数组中过滤掉该项。

为什么保存的是文字记录而非图片:当前版本的历史记录保存的是封面描述文字(“📕 标题 · 模板名”),而不是实际的封面图片。这是因为 ArkTS 的图片生成和保存涉及 Canvas 或文件系统 API,复杂度较高。文字记录的方式虽然没有视觉预览,但足以让用户回顾"我之前做过什么封面"。

删除操作的交互:点击 🗑️ 按钮后,使用 filter 方法生成新数组(排除被删除项),赋值给 this.history 触发重新渲染。没有确认弹窗——因为删除只是从文字列表中移除,不是从相册中删除真正的图片,误删的风险较低。


9. 视觉设计:粉白柔美

const C: ColorScheme = {
  bg: '#FFF5F7',           // 极浅粉(小红书底色)
  bgLight: '#FFEBF0',      // 浅粉背景
  primary: '#FF6B8A',      // 主色粉(按钮/强调)
  accent: '#FFB347',       // 暖橙(装饰)
  text: '#2D1B1B',         // 深棕
};

小红书平台的视觉风格以柔美、清新为主。本 App 的配色选择了粉色系作为主色调,配合不同模板的辅助色(绿/棕/蓝/黑/紫),覆盖了小红书上最常见的封面色彩。

粉色的使用策略:粉色在 App 的主界面中用于 Tab 选中态、按钮、边框选中态。粉色是一个"女性化"但不"幼稚"的颜色——它传达了柔美和亲和力,与小红书平台的用户画像一致。辅助色(#FFB347 暖橙)用于装饰选项的选中态,与粉色形成温暖的搭配。

37 款 App 的配色回顾

App 类型 代表 App 主色 色相
情感陪伴 AI 树洞 深紫 冷色
生产力工具 意愿清单 琥珀橙 暖色
氛围体验 复古电视 霓虹青 冷色
内容创作 封面生成器 粉色 暖色

内容创作工具倾向于使用暖色(橙色、粉色),因为暖色传递"创作"的能量感。氛围体验 App 倾向于使用冷色(青色、深紫),因为冷色传递"沉浸"的安静感。


10. ArkTS 兼容性记录

# 错误 位置 修复
1 const tpl 在 @Builder buildMiniPreview 改为 4 个 getter 方法
2 const tpl 在 @Builder buildPreviewOverlay 改为 getter 方法

实际错误数:2 个。这是 37 款 App 中错误最少的一款之一——与 App 32(复古未来风电视,2 个错误)并列最低。2 个错误全部是"老问题"(@Builder 中不能声明变量),说明 38 条之前的教训已经内化得非常好。

核心语法零错误:本 App 在 @Builder 之外的语法错误为零——没有 ForEach key 错误、没有类型错误、没有 import 错误、没有颜色格式错误。这说明经过 37 款 App 的训练,基础语法已经完全内化,编码时的错误率降到了极低水平。后续 App 的错误主要来自"新领域"(从未使用过的 API 或语法模式),而不是已有经验的遗忘。


11. 第三十七款 App 全景回顾

11.1 数据总览

指标 数值
代码行数 336 行
编译错误数 2 个
@Builder 方法 10 个
模板数量 6 套
装饰类型 5 种
Tab 数量 3 个

37 款 App 中,封面生成器是第 4 款"内容创作工具"(前 3 款是:博客一键转图文、爆款脚本库、AI 简历优化大师)。内容创作工具占总数的约 11%。

11.2 37 款 App 的错误数趋势

从 App 1 到 App 37,编译错误数的演变:

App 1:  22  → 第一次写 ArkTS,什么都不会
App 10: 15  → 学会了 ForEach 和 @Builder
App 20: 5   → 形成了自己的编码模式
App 24: 48  → 进入 AI 领域,全新错误类型
App 30: 5   → 回到熟悉领域,错误率回落
App 32: 2   → 最低记录(氛围型 App)
App 35: 7   → 社交训练 App(多 @Builder)
App 37: 2   → 并列最低(封面生成器)

App 37 的 2 个错误与 App 32 持平,并列 37 款 App 的最低记录。2 个错误全部是"在 @Builder 中声明了 const 变量"——这是一个从 App 13 开始就反复出现的教训,说明即使是最有经验的开发者,在快速编码时仍可能触犯这个规则。

37 款 App 的累计数据:总代码行数约 20,000 行,总编译错误约 265 个,平均每款 App 的错误数从 App 1 的 22 个下降到 App 37 的 2 个,下降了 91%。最大的单款错误数是 App 24(AI 树洞)的 48 个——那是进入 AI 对话领域时的新领域错误。最大的错误数降幅出现在 App 24 到 App 26(从 48 到 3),说明新领域的错误一旦被理解并记录,后续的同类 App 就能避免。

11.3 内容创作工具的四款 App

App 代码行数 创造的内容 核心交互
AI 简历优化大师 758 行 简历文本 表单填写 + 评分
博客一键转图文 458 行 分享卡片 文本输入 + 模板
爆款脚本库 493 行 视频脚本 模板浏览 + 套用
封面生成器 336 行 封面图 文字输入 + 实时预览

四款内容创作工具的代码行数从 336 到 758 不等,但核心逻辑是相通的:用户输入内容 + 选择模板 = 生成输出。这个模式在本系列中反复出现,已经形成了一套成熟的"输入→选择→输出"的 UI 架构。


12. 结语

12.1 37 款 App 的产品矩阵

从 App 1 到 App 37,产品类型覆盖了 10 个类别:

情感陪伴(3 款):情绪垃圾桶、AI 树洞、漂流瓶
生活管理(3 款):愿望清单、习惯打卡、意愿清单
人生规划(1 款):遗愿清单
职业发展(1 款):AI 简历优化大师
内容创作(4 款):博客一键转图文、爆款脚本库、AI 简历、封面生成器
氛围体验(2 款):复古未来风电视、陀螺仪星空
健康引导(1 款):冥想与正念
记录分析(1 款):梦境解析日记
心理训练(1 款):社恐脱敏训练营

内容创作类是最大的类别(4 款),占全部 App 的 11%。这与"写代码本身就是一种创作"的理念一脉相承。

12.2 封面生成器的设计启示

封面生成器是内容创作工具中最"轻"的一款——336 行代码、6 套模板、3 档字号、5 种装饰。但它完整覆盖了"输入→预览→保存"的内容创作闭环。用户在编辑 Tab 输入标题、在模板 Tab 选择风格、在预览弹窗确认效果——整个过程不超过 10 秒。

它的核心设计启示是:让用户的操作集中在"输入内容"上,其他的(配色、排版、样式)交给模板。用户不需要知道什么是渐变色、什么是字重、什么是强调色——模板系统替用户做了所有设计决策。

12.3 感谢

37 款 App、37 篇博客、约 370,000 字。从 App 1 的 22 个编译错误到 App 37 的 2 个编译错误——错误数下降了 91%,只用 37 款 App 的时间。

第 37 款 App 是一个"内容创作工具"——它帮助创作者解决封面设计这个具体问题。从"情绪垃圾桶"到"封面生成器",从释放情绪到创作内容——产品的进化方向越来越贴近"创造"而非"消费"。

37 款 App 覆盖了 10 种产品类型、使用了 5 种系统 API、产生了 40 条 ArkTS 铁律。每一款 App 都是下一款 App 的基石。第 1 款学会了 ForEach,第 10 款学会了 @Builder,第 20 款学会了深色主题——没有前 36 款的积累,第 37 款不可能以 2 个错误完成。

37 款 App 的代码行数从 173(陀螺仪星空)到 758(AI 简历优化大师),覆盖了从极简到中等的全部范围。但无论代码量多少,每一款 App 都完成了"从打开 App 到完成核心目标"的完整用户体验。代码量不是衡量 App 质量的标准——用户打开后能不能在 10 秒内完成核心任务才是。

现在,打开 DevEco Studio,写下你的下一篇爆款笔记的标题。封面已经准备好了。从第一行代码到第 37 款 App,你已经证明了持续输出的力量——现在去帮更多人证明他们也能创造好内容。


附录:核心代码速查

模板系统

interface CoverTemplate {
  id: number; name: string; bgColors: string[];
  fontColor: string; accentColor: string; style: string;
}

getter 方法模式

getTplFontColor(): string { const t = this.getTemplate(); if (t) return t.fontColor; return '#2D1B1B'; }
getTplAccent(): string { const t = this.getTemplate(); if (t) return t.accentColor; return '#FF6B8A'; }

保存历史

saveToHistory(): void {
  const entry = '📕 ' + this.title + ' · ' + this.getTemplate().name;
  this.history = [entry, ...this.history].slice(0, 20);
}

(全文完,约 10000 字)

Logo

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

更多推荐