鸿蒙入门到实战:手撸一个计算器APP
这里我将基于HarmonyOS + ArkTS,用最接地气的方式带你跳过概念轰炸,直接动手做出第一个鸿蒙应用。
一、写在前面:我为什么选择鸿蒙?
作为一名常年混迹Android/iOS的码农,第一次听说鸿蒙时内心是拒绝的:“又一套系统?生态能起来吗?”直到去年公司有个轻量级IoT项目,调研后发现鸿蒙的分布式能力真香!一次开发就能跑在手机、手表、智慧屏上,跨设备协同流畅得不像话。今天就用一个简易计算器的实战过程,带你感受鸿蒙开发的真实体验。
二、环境搭建:踩坑指南(5分钟搞定)
-
安装DevEco Studio: 去官网下最新版,建议选纯ArkTS模板开发。
-
配置SDK: 首次打开会引导下载SDK,重点勾选:
-
API 16
-
ArkTS 3.8+
-
Previewer(模拟器) → 实测比真机调试快
-
-
创建项目: 选
Empty Ability
,语言选ArkTS
,设备选Phone
。
避坑提示: 遇到Gradle同步失败?99%是网络问题!开全局代理或换国内镜像源(华为有提供教程)。
三、认识ArkTS:TypeScript的鸿蒙特供版
ArkTS不是新语言,而是TypeScript的超集,加入了鸿蒙特有的UI描述和状态管理语法。看个例子就懂:
// 定义一个响应式数据
@State count: number = 0;
// UI描述 (类似SwiftUI/Compose)
build() {
Column() {
Text(`点击次数: ${this.count}`) // 数据绑定
.fontSize(30)
.margin(20)
Button('点我+1')
.onClick(() => {
this.count += 1; // 修改数据自动刷新UI
})
}
}
关键点:
-
@State
:标记可变状态,数据变 → UI自动更新 -
build()
:返回UI组件树 -
链式调用:
.width().height().onClick()
一气呵成
四、实战:计算器APP开发(手把手版)
1. 需求拆解
-
显示输入和结果
-
支持加减乘除
-
带清零功能
-
适配不同屏幕
2. 核心代码实现
定义状态:
@State input: string = '0'; // 当前输入
@State result: string = ''; // 显示结果
@State operator: string = ''; // 当前操作符
@State firstNum: number = 0; // 存储第一个操作数
数字按钮处理:
handleNumberPress(num: string) {
if (this.input === '0' || this.isNewInput) {
this.input = num;
this.isNewInput = false;
} else {
this.input += num;
}
操作符按钮处理:
handleOperatorPress(op: string) {
if (this.operator === '') {
this.firstNum = parseFloat(this.input);
} else {
this.calculate(); // 执行上一次计算
}
this.operator = op;
this.isNewInput = true;
}
核心计算逻辑:
calculate() {
const secondNum = parseFloat(this.input);
let calcResult: number;
switch (this.operator) {
case '+':
calcResult = this.firstNum + secondNum;
break;
case '-':
calcResult = this.firstNum - secondNum;
break;
case '×':
calcResult = this.firstNum * secondNum;
break;
case '÷':
calcResult = this.secondNum !== 0 ? this.firstNum / secondNum : NaN;
break;
default:
return;
}
this.result = `${this.firstNum} ${this.operator} ${secondNum} =`;
this.input = isNaN(calcResult) ? 'Error' : calcResult.toString();
this.firstNum = calcResult;
}
UI布局关键代码:
// 结果显示区域
Text(this.result)
.fontSize(20)
.textAlign(TextAlign.End)
Text(this.input)
.fontSize(40)
.textAlign(TextAlign.End)
// 按钮网格布局
Grid() {
ForEach(this.buttons, (item: ButtonData) => {
Button(item.label)
.onClick(() => {
if (item.type === 'number') {
this.handleNumberPress(item.value);
} else if (item.type === 'operator') {
this.handleOperatorPress(item.value);
} else if (item.value === 'C') {
this.clearAll();
}
})
})
}
.columnsTemplate('1fr 1fr 1fr 1fr') // 4列等宽
.rowsGap(20) // 行间距
.columnsGap(10) // 列间距
五、调试技巧:救命的3招
-
实时预览: 修改代码后Cmd+S保存,右侧Previewer秒级刷新
-
日志输出: 用
Logger.d(TAG, '输出内容')
替代console.log -
断点调试: 和Chrome DevTools体验几乎一致
常见报错解决:
-
Syntax error
→ 检查ArkTS语法(特别是@State
修饰器) -
UI not updating
→ 确保修改的是@State
修饰的变量 -
Component not found
→ 检查组件名拼写(区分大小写!)
六、项目优化:让计算器更实用
小数点处理:
if (!this.input.includes('.')) {
this.input += '.';
}
退格功能:
this.input = this.input.slice(0, -1);
if (this.input === '') this.input = '0';
横屏适配:
@Prop isLandscape: boolean; // 通过父组件传入屏幕方向
build() {
if (this.isLandscape) {
// 横屏特殊布局
} else {
// 竖屏布局
}
}
七、打包发布:生成HAP文件
-
菜单栏 → Build → Build Hap(s)/APP(s) → Build Hap
-
等待编译完成,在
build/outputs
目录找到.hap文件 -
用华为应用市场开发者后台提交审核(需企业账号)
八、学习资源:拒绝官方套话
-
GitHub宝藏库: awesome-harmonyos(第三方组件/工具集合)
-
实战课程: 各个平台都能找到的《ArkUI实战课》
-
官方文档: 只看《ArkTS开发指南》和API参考
九、总结:鸿蒙值不值得学?
短期看: 生态在高速成长,纯鸿蒙岗位不能说多(但增速极快)
长期看: 分布式架构是趋势,华为投入决心巨大
开发者红利: 早期技术移民享受文档/社区/就业多重红利
我的建议: 如果你在做IoT、车载、智能硬件,鸿蒙的分布式能力能直接提升生产力;如果是移动开发者,花2天学ArkTS相当于掌握未来5年的技术备胎。毕竟连美团、支付宝都在招鸿蒙开发了,现在上车正当时。
更多推荐
所有评论(0)