夜,已经很深了。

城市的喧嚣褪去,只剩下窗外偶尔驶过的车流,像一条条沉默的星河。我的房间里,只有笔记本电脑屏幕发出的惨白光芒,映照着我疲惫而布满血丝的双眼。

空气中弥漫着一股速溶咖啡和失望混合的味道。

我叫阿杰,一名有五年 Android 开发经验的程序员。在公司的战略转型下,我被“委以重任”,加入新成立的鸿蒙应用开发先锋队。最初,我是兴奋的。鸿蒙的分布式理念、万物互联的宏大叙事,让我这个技术人热血沸腾,仿佛看到了下一个时代的浪潮之巅。

然而,理想的火焰,在现实的冰雨面前,被浇得只剩下摇摇欲坠的火苗。

摆在我面前的,是项目启动的第一个任务:开发一个电商应用的商品展示页面。需求听起来很简单——一个商品卡片列表,每张卡片包含商品图、标题、价格和标签。但在鸿蒙技术开发领域里,这个“简单”的需求,却成了我的“滑铁卢”,隔行如隔山,不是开玩笑的。

“阿杰,记住,我们的应用要体现鸿蒙的特色,要能完美适配手机、平板和折叠屏。” 项目经理的话还在耳边回响。

“完美适配”,这四个字像一座大山,压得我喘不过气来。

我用 ArkUI 的 Grid 容器来实现这个列表。在手机上,我设置了每行两列,效果还不错。但当模拟器切换到平板模式时,灾难发生了。那两列卡片孤零零地挤在屏幕中央,两边留下了大片尴尬的空白,像两颗门牙中间的巨大缝隙,丑得让人不忍直视。

“这不行,太浪费空间了。” 我自言自语,开始我的挣扎。

我的第一反应是,判断设备类型,然后用 if-else 来设置不同的列数。代码大致是这样的:

// 一个非常粗糙的尝试
if (设备是平板) {
  Grid() { ... }.columnsTemplate('1fr 1fr 1fr 1fr') // 强行设置4列
} else {
  Grid() { ... }.columnsTemplate('1fr 1fr') // 手机上2列
}

但这很快就暴露了更多问题。首先,如何精准判断设备类型?通过屏幕宽度吗?那临界值是多少?折叠屏展开和闭合的状态又该如何处理?代码里充斥着大量的“魔法数字”和设备判断逻辑,丑陋不堪,维护性极差。更糟糕的是,当我在折叠屏上进行展开和闭合操作时,UI 的刷新总会慢半拍,甚至出现布局错乱。

时间在一分一秒地流逝。我像一只没头的苍蝇,在官方文档的迷宫里乱撞。我尝试了 media-query,但对它的语法和断点(breakpoints)的理解一知半解,写出来的效果时好时坏。我又去翻阅各种社区论坛和博客,里面的答案五花八门,有些代码片段甚至还是基于 JS UI 的旧版本,根本无法在我的 ArkTS 项目中运行。

挫败感如同潮水,一波又一波地冲击着我的心理防线。

“不就是一个响应式布局吗?在 Web 端用 CSS Grid 和 Flexbox 几行代码就能搞定的事,为什么到了这里就这么复杂?” 我烦躁地抓着头发,感觉自己过去五年的经验在鸿蒙面前,脆弱得像一张薄纸。

屏幕上的 DevEco Studio 图标,此刻看起来是那么刺眼。我甚至产生了一个可怕的念头:也许,我根本不适合鸿蒙开发。也许,我应该回到我熟悉的 Android “舒适区”,傻傻盯着编辑器发呆中。

我把脸深深埋进手掌,滚烫的眼眶里泛起一阵酸楚。就在我身心俱疲,准备关闭电脑,甚至想要删掉这个让我备受折磨的开发工具时,我的手机“叮”地亮了一下。

是一个公司内部的鸿蒙开发者交流群的消息,一位我非常敬重的技术大佬发了一个链接和一个二维码,配文是:“各位同学,别再自己瞎摸索了,官方把‘武功秘籍’都开源了。强烈推荐这个APP——HMOS代码工坊,尤其是新手,能救命。”

“武功秘籍?” 我嗤之以鼻,心想无非又是一个官方 Demo 的集合罢了,能有多大用处?

但“能救命”三个字,像一根救命稻草,让濒临放弃的我,还是下意识地拿起了手机,扫了那个二维码。

下载、安装、打开。

启动页过后,一个清爽的界面呈现在眼前:【组件库】、【样例】、【实践】、【我的】。

我抱着死马当活马医的心态,点进了【组件库】。屏幕上,ArkUI 的各种组件以卡片的形式整齐排列着,RowColumnTextImage……一直划到底部,我看到了那个让我头疼不已的 Grid

我点了进去。

奇迹,就在这一刻发生了。

Grid 的详情页被分成了三个区域:顶部是预览区,左下是属性调整区,右下是代码区

预览区里,正是我想要的网格布局。属性调整区里,columnsTemplaterowsTemplategutter 这些属性,都变成了可视化的开关和滑块!

我颤抖着手指,点开了 columnsTemplate 属性的设置。里面赫然出现了 repeat(auto-fill, 160vp) 这样的选项。我尝试着点选了它。

瞬间,顶部的预览区发生了变化。网格里的卡片不再是固定的列数,而是根据屏幕宽度自动填充,每张卡片的宽度保持在 160vp 左右,并且间距均匀,看起来和谐又美观。

更让我震惊的是,在我点选的同时,右下方的代码区,也实时地生成了对应的代码:

@Componentstruct
TextInputComponent{
  build() {
    Column() {
      TextInput({ placeholder: '请输入文字'}
        .margin({ left: 36,right: 36 })
        .height(48)
        .enterKeyType(EnterKeyType.Done)
        .borderRadius($r('sys.float.corner.fontSize($r('
      sys.float.Body_L
      ')).fontWeight(FontWeight.Regular)' +
        .backgroundColor($r('sys.color.comp
        .caretStyle({color: $r('sys.color.
          .type(InputType.Normal)
          .fontColor('rgba(0, 85, 255,1.0)')
          .placeholderFont({ size:$r('sys.fl
      }
    }
  }

我的大脑“嗡”的一声,仿佛有一道闪电划破了长久以来的黑暗。

repeat(auto-fill, ...)?原来……原来 ArkUI 的 Grid 布局支持这种类似 CSS Grid 的语法!为什么我之前翻遍文档都没注意到这个细节?”

我迫不及待地继续探索。我拖动 gutter(间距)的滑块,预览区和代码区的数值也跟着实时变化。我又看到了一个叫做 breakpoints 的属性,点进去一看,里面预设了 smmdlg 等不同屏幕尺寸的断点参考。

详情页里甚至还有一个“响应式”开关,打开后,代码区立刻生成了一段让我拍案叫绝的代码:

// 伪代码,示意HMOS代码工坊的强大
.columnsTemplate(this.breakpoints.sm ? '1fr 1fr' : 'repeat(auto-fill, 160vp)')

它利用了断点系统,优雅地实现了在小屏(如手机)上固定两列,而在大屏(如平板)上自动填充的逻辑。这不就是我苦苦追寻的“完美适配”方案吗?

这一刻,我没有去复制代码。我只是贪婪地在这个交互式的“实验室”里不断尝试。我调整每一个属性,观察预览区的变化,理解代码区的生成逻辑。我仿佛不是在学习,而是在“玩”一个关于 ArkUI 的乐高积木。那些曾经冰冷、抽象的 API,在“代码工坊”里,变得鲜活、直观,触手可及。

它就像一位耐心的导师,坐在我身边,手把手地告诉我:“你看,这个属性这样用,效果是这样的。代码应该这么写,才最优雅。”

那个深夜,我没有再碰我的项目代码。我沉浸在 HMOS 代码工坊的世界里,把【组件库】里的每一个组件都玩了一遍。我不仅彻底搞懂了 Grid 的响应式布局,还学会了 Swiper 的酷炫转场动画,掌握了 WaterFlow 瀑布流的用法。

困扰我数日的阴霾一扫而空,取而代之的是一种久违的、掌控知识的兴奋和愉悦。我终于明白大佬为什么说它是“武功秘籍”了。它给我的,不仅仅是解决问题的“鱼”,更是理解鸿蒙开发思想的“渔”。

熄灯,躺在床上,我久久不能平静。我没有删掉 DevEco Studio,反而对明天充满了期待。

我知道,我的鸿蒙开发之路,才刚刚开始。而 HMOS 代码工坊,就是我在这条新征程上,获得的第一件“神兵利器”。

解决了基础的 UI 布局难题,我以为可以松一口气。但没想到,几天后,项目经理带着一个关于系统级特性的新需求找到了我,那个挑战,正悄然而至……


想要和我一样,从鸿蒙开发的迷茫中找到方向吗?立刻下载 HMOS 代码工坊,开启你的高效开发之旅!💪

  • 下载官方HMOS代码工坊,请这边走【下载传送门】打开华为应用市场,搜索"HMOS代码工坊",或扫描点击链接下载,切记要机型匹配才能安装(HarmonyOS 5.1.0 Release及以上)
  • 【 更多精彩内容,请关注公众号:【名称:HarmonyOS开发者技术,ID:HarmonyOS_Dev】
  • 也欢迎加入鸿蒙开发者交流群

(未完待续)

Logo

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

更多推荐