零、前情回顾

        上一篇咱们给润和Dayu200(RK3568)搭好了OH6.0(API20)的“豪华底座”,相当于给这台“硬件猛将”配齐了新装备。

您要是忘了 可以点开链接 回顾回顾 

【开源鸿蒙开发板应用升级适配大赛】第一篇:入门篇——润和Dayu200(RK3568)搭载OpenHarmony 6.0从API9到API20升级基础https://blog.csdn.net/weixin_31236533/article/details/157184823咱准备好了开发板了,再看看组委会给了咱们什么宝藏?

大赛核心任务
  1. 基于指定 AtomGit 开源项目清单中的现有应用,完成两大核心升级:
    • 技术版本适配:从 OpenHarmony 旧版本(适配 API9)升级至 OpenHarmony 6.0 版本(适配 API20);
    • 功能兼容性优化:确保升级后应用功能完整、运行稳定,适配主流鸿蒙开发板。
  2. 大赛项目开源仓库:

        这篇咱不搞复杂的,就从最基础却最能露一手的简易计算器下手——毕竟谁还没写过一个“只能算加减乘除、卡得像老算盘”的API9计算器呢?这次咱就给它来个“脱胎换骨”,从API9的“老年机算盘”,升级成API20的“智能计算器”,边改边唠,实操不踩坑,段子不缺席!

一、计算器升级:别让“基础款”拖了API20的后腿

        先吐槽一句:API9时代的简易计算器,简直是“功能贫瘠户”——界面呆板像块板砖,按键反馈慢半拍,算个两位数乘法都要等一下,历史记录存不了几条还容易崩,更别提多端适配了,换个设备界面直接“崩成乱码”。

        咱手里的Dayu200(RK3568)芯片,算力够顶、响应够快,跑这种“残血计算器”纯属大材小用。而API20就像给计算器开了“外挂”:状态管理丝滑不卡顿,UI组件能自定义样式,还能轻松实现多端适配,甚至加个按键动画、优化历史记录存储都不在话下。这次升级的目标很明确:让简易计算器告别“原始时代”,既好用又好看,还能在Dayu200上跑得“飞起来”!

        更重要的是,计算器虽小,却涵盖了ArkTS开发的核心知识点——状态管理、UI布局、本地存储,把它的升级吃透,后面搞复杂应用都能举一反三,相当于“以小见大”练手,性价比直接拉满。

说了这么多记得先 star、fork、clone 咱们组委会的仓库

https://gitcode.com/szkygc/codelabs

找到计算器这个项目 SimpleCalculator

或者您直接看我们哏儿都队的repo吧o(*'▽'*)/☆Yes~ 都开源的

https://gitcode.com/JaneConan/genduoh/tree/main/ETSUI/SimpleCalculator

确认 克隆好 咱们上车 开 DevEco Studio 打开项目

找到这个文件夹

你有用 Mac 啊~ 没事,麦克长下面这样子哈~

打开项目后,我们懵了,咋升级来着,臣妾做不到啊!

别慌组委会给咱们锦囊了!!!

使用Migrate Assistant自动迁移

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V14/ide-integrated-project-migration-V14

没想到吧 6.0.1都在提示了

咱参与活动,6.0.0就行

二、升级前摸底:API9计算器的“三大槽点”

动手升级前,先给API9版计算器做个“体检”,看看那些让人头疼的槽点,精准打击才高效:

1. 状态同步“慢半拍”,算个账像等快递

API9的状态管理逻辑比较繁琐,按键输入和结果显示经常不同步——按了“5”,屏幕隔一秒才显示,算个1+1都能让人怀疑人生。就像你点了外卖,商家都做好了,骑手却迟迟不动,体验感拉胯到极致。

2. UI界面“没颜值”,呆板到没朋友

API9的组件样式局限性极大,计算器按键只能是方方正正的基础款,颜色、字体、圆角都没法自定义,界面单调得像黑白电视。放在Dayu200的屏幕上,显得格格不入,完全对不起这板子的硬件质感。

3. 存储与适配“双拉胯”,实用性为零

历史记录靠API9的preferences接口存储,不仅容量小,还容易丢失,关了应用再打开,之前算的数全没了;多端适配更是奢望,换个平板设备,按键要么挤成一团,要么散得老远,根本没法用。

摸清这些槽点,咱们的升级就有了明确方向:针对性解决卡顿、美化界面、优化存储与适配,让计算器“脱胎换骨”。

三、实战升级:API20改造三步走,计算器“满血复活”

接下来进入核心实操环节,咱们对着Dayu200开发板,一步步把计算器从API9升级到API20,每一步都讲透、讲活,小白也能跟上:

第零步,弄一弄版本号😂

外层的

{
  "app": {
    "products": [
      {
        "name": "default",
        "signingConfig": "default",
        "compileSdkVersion": 20,
        "targetSdkVersion": 20,
        "compatibleSdkVersion": 9,
        "runtimeOS": "OpenHarmony"
      }
    ]
  },
  "modules": [
    {
      "name": "entry",
      "srcPath": "./entry",
      "targets": [
        {
          "name": "default",
          "applyToProducts": [
            "default"
          ]
        }
      ]
    }
  ]
}

entry内层的

{
  "apiType": 'stageMode',
  "buildOption": {
  },
  "targets": [
    {
      "name": "default"
    }
  ]
}

entry/src/main/ets/entryability/EntryAbility.ts 文件

import { UIAbility } from "@kit.AbilityKit";
import { window } from "@kit.ArkUI";
import { hilog } from "@kit.PerformanceAnalysisKit";


export default class EntryAbility extends UIAbility {
  onCreate(want, launchParam) {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }

  onDestroy() {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage) {
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/HomePage', (err, data) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
    });
  }

  onWindowStageDestroy() {
    // Main window is destroyed, release UI related resources
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground() {
    // Ability has brought to foreground
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground() {
    // Ability has back to background
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }
}

然后咱们看看 API 20 还能搞些啥!

1. 第一步:UI重构——给计算器“换身新衣服”

API20的ArkUI组件简直是“美化神器”,以前API9实现不了的样式,现在轻松拿捏。咱先重构界面,告别“板砖风”:

首先把布局从API9的基础容器,换成API20的 Flex 和 Grid 布局,按键排列更规整,还能自适应屏幕尺寸——在Dayu200上显示刚好,换到平板上也不会错乱。然后用 API11 开始 的 AttributeModifier 接口,给按键加圆角、自定义颜色,数字键用浅蓝色、运算键用橙色,还能加个按压反馈效果,按下去有轻微变色动画,手感直接拉满。

属性修改器 (AttributeModifier)https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-user-defined-extension-attributemodifier

What?咱们不会写! 对,真不会啊!

没事没事 快来救驾  与 CodeGenie 结伴啊!对对对(o ̄∀ ̄)ノYes~ 登录 启动!

嚯嚯嚯!这么多功能啊 ~ 哇🤩

原来改个需求如此简单啊!

这里给大家避个坑:修改组件样式时,别贪多求全,Dayu200的屏幕尺寸有限,样式太复杂反而显得杂乱,简约美观才是王道。就像给衣服搭配配饰,少而精才高级,堆砌太多反而土气。

2. 第二步:逻辑优化——状态同步“秒响应”

卡顿的核心问题的是状态管理,API12 开始 的 ohos.arkui.StateManagement 给咱送来了“救星”,用@State、@Link装饰器优化状态绑定,让按键输入和结果显示实现“零延迟同步”。

@ohos.arkui.StateManagement (状态管理)https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-statemanagement

以前 API9 要写好几行代码才能实现的状态更新,现在一行就能搞定——按一下按键,屏幕瞬间显示对应数字,算复杂运算也丝滑不卡顿。咱还能优化运算逻辑,加个异常处理,比如除数为零的时候,弹出提示弹窗(后续弹窗篇会细讲,这里先埋个伏笔),再也不会出现算错就崩的情况。

测试的时候可以多按几下按键,在Dayu200上感受一下——以前的“慢半拍”彻底消失,响应速度快到飞起,这才是RK3568芯片该有的实力!

3. 第三步:存储与适配——告别“一次性”计算器

先解决历史记录存储问题:把API9的旧preferences接口,换成API12的 relationalStore 接口,存储容量更大、稳定性更强,就算关掉应用再打开,之前的运算记录也能完整保留,还能支持删除、清空功能,实用性直接拉满。

@ohos.data.sendableRelationalStore (共享关系型数据库)https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-data-sendablerelationalstore

再搞定多端适配:利用API20的断点监听(useBreakpoint()),动态调整按键大小和间距——在Dayu200这种小屏设备上,按键紧凑不拥挤;换到平板上,按键自动放大,操作更便捷。再也不用为了不同设备单独改布局,真正实现“一次开发,多端适配”。

四、踩坑实录:这些“坑”别踩,不然白忙活

升级过程中难免遇到“拦路虎”,咱把典型坑点列出来,帮你少走冤枉路,毕竟谁也不想忙活半天,结果卡在小问题上:

1. 坑点一:状态绑定混乱,越改越卡

刚开始升级时,容易混用API9和API20的状态管理逻辑,导致状态冲突,计算器越改越卡。解决方案很简单:彻底摒弃API9的旧写法,统一用API20的状态装饰器,逻辑清晰不混乱,卡顿问题直接解决。

2. 坑点二:UI适配过度,Dayu200跑不动

有些小伙伴追求美观,给计算器加了大量复杂动画和样式,结果Dayu200负载过高,出现卡顿、闪退。记住:硬件适配要“量力而行”,Dayu200虽强,但也经不起过度消耗,简约动画+轻量化样式才是最优解。

3. 坑点三:存储接口迁移不彻底,记录丢失

只替换存储接口,不做旧数据迁移,会导致升级后历史记录全部丢失。正确做法是:升级时写一段数据迁移代码,把API9 preferences里的旧数据,同步到API20的 relationalStor e中,实现平滑过渡。

记得在调试应用前去做签名哦~

不妨我们再去看看 API 20 的优化!

6.0.0(20) 关键特性https://developer.huawei.com/consumer/cn/doc/harmonyos-releases/os-new-feature-600啥! 你还想优化性能!那了解了解 Testing 吧~

五、升级收尾:验证优化,计算器“完美上岗”

升级完成后,别着急收尾,在Dayu200上做个全面“验收”,确保计算器既好用又稳定:

先测功能完整性:加减乘除运算是否准确,异常情况(除数为零、连续按运算键)是否有提示,历史记录存储、删除是否正常;再测性能:按键响应是否丝滑,长时间操作会不会卡顿、闪退;最后测多端适配:换个设备测试界面是否正常,按键操作是否便捷。

如果发现卡顿,就精简动画和逻辑;如果历史记录丢失,就检查数据迁移代码。优化完成后,你会发现——这台计算器再也不是以前的“残血版”,而是能打又好看、稳定又实用的“满血神器”,放在Dayu200上,完美契合这板子的硬件实力。

搞定计算器升级,是不是觉得API20的实操也没那么难?

其实只要找对方法,把复杂问题拆解成一个个小步骤,再加点幽默调剂,技术开发也能充满乐趣。

下一篇,咱们就挑战更有难度的弹窗组件升级,解锁API20的自定义样式技能,让应用交互更上一层楼!

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐