书名:鸿蒙原生应用开发ArkTS语言快速上手
ISBN:978-7-115-64250-9
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 刘 玥 张荣超
责任编辑 吴晋瑜
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
本书通过丰富的示例,以简明扼要的方式讲解了ArkTS语言的基础知识和核心概念,并介绍了数据操作、流程控制语句、函数、面向对象编程、空安全、错误处理、容器、泛型、导出和导入等内容。其中,“面向对象编程”这一章涉及一系列重要的概念,包括类、对象、封装、继承、多态、重写、抽象类和接口等,为此给出了一个小型的课务管理项目,以帮助读者理解这些概念。
本书适合希望快速上手ArkTS语言的初学者阅读。
刘玥,九丘教育CEO,曾在高校任教十余年,具有丰富的课堂教学经验,尤其擅长讲授程序设计、算法类课程。
张荣超,九丘教育教学总监、华为开发者专家(HDE)、华为首届HarmonyOS开发者创新大赛最佳导师、OpenHarmony项目群技术指导委员会(TSC)委员。
ArkTS语言是目前鸿蒙原生应用开发的主力语言。ArkTS在TypeScript的基础上进行了优化、限制和扩展,旨在提供更高的性能和更佳的开发效率。它不仅继承了TypeScript的强大功能和灵活性,还加入了针对鸿蒙特有场景的特性,使得开发者能够更便捷地开发鸿蒙原生应用。
在本书的编写过程中,我们深感ArkTS在推动鸿蒙生态发展中的重要作用。我们希望本书不仅能够传授技术知识,更能激发开发者对鸿蒙原生应用创新的热情,投入到探索和实现更多令人兴奋的应用场景中去。
无论您的目标是提升个人技能,还是在鸿蒙生态中留下自己的印记,我们相信,本书都将带给您一些启发和帮助。让我们一起开始这段探索ArkTS和鸿蒙无限可能的旅程。
为了确保读者能够顺利实操书中的示例,本书提供了相应的引导教学视频,欢迎广大读者关注抖音/微信视频号“九丘教育”获取视频教程和本书源代码。之后针对ArkTS的更新,我们会在第一时间通过抖音、微信视频号、微信公众号、B站等平台持续同步更新相关内容(搜索“九丘教育”)。
另外,由于成书时间仓促以及作者水平有限,书中难免有疏漏,恳请各位读者批评、指正。欢迎各位读者通过本书发布的各种联系方式与作者交流。
感谢人民邮电出版社的傅道坤和吴晋瑜编辑为本书的顺利出版提供的鼎力支持和宝贵建议。最后,还要向广大读者表示衷心的感谢!
本书内容分为10章,各章的主要内容如下。
第1章 “起步”:主要介绍了第一个ArkTS程序的编写。
第2章 “简单的数据操作”:首先介绍了变量和常量的用法,然后介绍了常见的数据类型和常用的操作符,最后介绍了常用的数学函数。
第3章 “流程控制语句”:主要介绍了各种条件语句和循环语句。
第4章 “函数”:首先介绍了函数的定义和调用,然后介绍了函数的参数传递,最后介绍了箭头函数和闭包。
第5章 “面向对象编程”:首先介绍了类的定义和对象的创建,然后详细介绍了面向对象编程的三大特征——封装、继承和多态,最后介绍了抽象类和接口的用法。
第6章 “空安全”:首先介绍了什么是空安全,然后介绍了与空安全相关的特性,包括可选链、非空断言操作符和空值合并操作符。
第7章 “错误处理”:首先介绍了try-catch-finally语句,然后介绍了使用throw手动抛出内置错误类的对象和自定义错误类的对象。
第8章 “容器”:首先介绍了常见的高阶函数在数组中的用法,然后介绍了几种常见的容器类型——元组、Set、Map和Record。
第9章 “泛型”:首先介绍了泛型函数,然后介绍了泛型类和泛型接口这两种泛型类型。
第10章 “导出和导入”:首先介绍了顶层声明的默认可见性,然后介绍了顶层声明的导出和导入,最后介绍了导入SDK的开放能力。
本书面向对ArkTS语言感兴趣的所有读者。本书包含丰富的示例,即使读者尚未接触过任何编程语言,也能在本书的指引下,逐步顺畅地掌握ArkTS语言的基础知识和核心概念。
读者可以扫描下方二维码,根据指引领取异步社区7天VIP会员福利。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区(https://www.epubit.com),按书名搜索,进入本书页面,单击“发表勘误”,输入错误信息,单击“提交勘误”按钮即可(见下图)。本书的作者和编辑会对您提交的错误信息进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是wujinyu@ptpress.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们。
如果您所在的学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”(www.epubit.com)是由人民邮电出版社创办的IT专业图书社区,于2015年8月上线运营,致力于优质内容的出版和分享,为读者提供高品质的学习内容,为作译者提供专业的出版服务,实现作者与读者在线交流互动,以及传统出版与数字出版的融合发展。
“异步图书”是异步社区策划出版的精品IT图书的品牌,依托于人民邮电出版社在计算机图书领域40余年的发展与积淀。异步图书面向IT行业以及各行业使用IT技术的用户。
ArkTS是目前鸿蒙原生应用开发的主力语言。ArkTS语言在TypeScript语言的基础上扩展了一些功能(尤其是在UI开发方面),但也增加了一些禁止和限制规则。
TypeScript是JavaScript的一个超集,它在JavaScript的基础上添加了静态类型系统并引入了一些其他特性。JavaScript是一种高级的解释型动态语言,最初用于浏览器,现在还广泛用于服务器端编程(主要通过Node.js)。TypeScript可以看作对JavaScript的一个增强。
ArkTS、TypeScript和JavaScript之间的关系如图1-1所示。所有JavaScript代码都是有效的TypeScript代码,反之则不然。TypeScript和ArkTS有交集,但由于ArkTS的限制和扩展,它们不是完全的包含关系,这个交集包括符合ArkTS规则的TypeScript代码。JavaScript和ArkTS也有交集,但同样不是完全的包含关系,这个交集包括符合ArkTS规则的JavaScript代码。
图1-1 ArkTS、TypeScript和JavaScript的关系
ArkTS语言的主要特性如下。
■ 静态类型的强制使用:ArkTS采用静态类型,确保了程序中变量的类型在编译期间就已确定。这一设计不仅能够在编译时验证代码的正确性,减少运行时的类型检查需求,还能提高程序的执行效率。这是ArkTS最为关键的特性之一。
■ 禁止在运行时改变对象布局:为了追求最高性能,ArkTS不允许在运行时改变对象的布局。这一举措有助于优化性能表现。
■ 对操作符语义的限制:为了获得更高效的性能表现以及鼓励开发者编写更为清晰、易于阅读的代码,ArkTS对某些操作符的语义做出了限制。
■ 对UI开发框架能力的扩展:ArkTS定义了声明式UI描述和自定义组件,具有动态扩展UI元素的功能,提供了多维度的状态管理机制和渲染控制功能。
开发鸿蒙原生应用所使用的集成开发环境(IDE)是DevEco Studio。为了确保读者能够顺利搭建好开发环境并实践本书中的操作,作者提供了相关的视频教程。读者可以扫描图1-2所示的抖音或微信视频号二维码,获取视频教程。如果读者在学习本书的过程中遇到问题,也可以通过下面的二维码与我们联系。
抖音 微信视频号
图1-2 相关二维码
为了测试开发环境,我们已经在DevEco Studio中创建好了第一个鸿蒙工程:Hello World。打开Previewer窗口,可以看到工程页面的预览,如图1-3所示。
注
不同的API版本需要进行的工程配置不同,创建Hello World工程的详细步骤参见配套的视频教程。
图1-3 Hello World的启动页面
在工程文件夹下有很多目录和文件,这些目录和文件各有其用处,目前我们只关心其中的一个文件:工程文件夹下的目录entry > src > main > ets > pages中的文件Index.ets。ArkTS文件的扩展名为ets,文件Index.ets中定义的就是Previewer窗口中显示的工程页面。文件Index.ets中的代码是创建工程时由DevEco Studio自动生成的,如代码清单1-1所示。若最新版本的DevEco Studio自动生成的代码与代码清单1-1不同,请将其替换为书中的代码。
代码清单1-1 Index.ets
01 @Entry
02 @Component
03 struct Index {
04 @State message: string = 'Hello World';
05
06 build() {
07 Row() {
08 Column() {
09 Text(this.message)
10 .fontSize(50)
11 .fontWeight(FontWeight.Bold)
12 }
13 .width('100%')
14 }
15 .height('100%')
16 }
17 }
尽管ArkUI的相关知识不在本书的讨论范围之内,但我们还是有必要简单了解一下Hello World工程中的一些基本的UI知识。文件Index.ets的各个组成部分如图1-4所示。
图1-4 文件Index.ets的各个组成部分
上述程序创建了一个自定义组件Index,该组件有两个装饰器,即@Entry和@Component。其中,@Entry表示该组件为入口组件,@Component表示自定义组件。相关代码如下:
@Entry
@Component
struct Index {
// 自定义组件Index内部的代码
}
Index组件定义了一个状态变量message以及UI描述(build方法中的代码块)。UI描述以声明的方式来描述UI的结构,即我们看到的UI页面的结构。在build方法中,我们定义了一个系统组件Row。相关代码如下:
Row() {
// 组件Row内部的代码
}
.height('100%')
其中,height是一个属性方法,用于设置Row组件的高度。
在Row组件中,我们定义了一个系统组件Column;在Column组件中,又定义了一个系统组件Text。Text组件显示的文本为message中存储的字符串'Hello World'。相关代码如下:
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
}
.width('100%')
其中,属性方法width用于设置Column组件的宽度,属性方法fontSize和fontWeight分别用于设置Text组件中文本的字号和字重(字体粗细)。
系统组件是ArkUI框架中内置的基础组件或容器组件,开发者可以直接使用。示例程序中用到的组件Row和Column都属于容器组件,用于容纳其他组件;Text组件则属于基础组件,用于显示文本。
不同的组件具有不同的属性方法,这些方法都可以通过符号“.”来链式调用。例如,上面的代码通过链式调用属性方法fontSize和fontWeight设置了Text组件中文本的字号和字重。
当程序开始运行时,首先运行的是由@Entry装饰的入口组件,对应的是以上程序中的自定义组件Index,此时系统会自动调用Index组件的build方法,于是我们看到了Hello World的启动页面(见图1-3),该页面的组成如图1-5所示。页面的最上层是Text组件,其范围由白色表示;Text组件的下层是Column组件,其范围由深灰色表示(包括Text组件遮盖的范围);Column组件的下层是Row组件,其范围由浅灰色表示(包括Column组件遮盖的范围)。
图1-5 Hello World的页面组成
除了属性方法,不同的组件还具有不同的事件方法。通过触发或调用组件的事件方法,我们可以设置组件对事件的响应逻辑。接下来要做的是,修改一下Hello World程序,在页面上添加一个表示按钮的Button组件,并为其添加对按钮的单击事件的响应逻辑。修改后的Index.ets如代码清单1-2所示。
代码清单1-2 Index.ets
01 @Entry
02 @Component
03 struct Index {
04 @State message: string = 'Hello World';
05
06 build() {
07 Row() {
08 Column() {
09 Text(this.message)
10 .fontSize(50)
11 .fontWeight(FontWeight.Bold)
12
13 /*
14 * 在Text组件下方添加一个按钮组件Button
15 * 单击该按钮后页面上显示的文本将发生变化
16 */
17 Button('点我')
18 // 设置按钮的相关属性并添加响应单击事件的逻辑
19 .fontColor(Color.White)
20 .fontSize(40)
21 .width(150)
22 .height(70)
23 .backgroundColor(Color.Gray)
24 .type(ButtonType.Capsule)
25 .onClick((event: ClickEvent) => {
26 this.message = 'Hello ArkTS';
27 })
28 }
29 .width('100%')
30 }
31 .height('100%')
32 }
33 }
起初在Previewer窗口中看到的页面如图1-6(a)所示,接着单击“点我”按钮,可以看到图1-6(b)所示的运行效果。
注
尽管在预览器(Previewer窗口)中查看运行效果比较方便,但是推荐读者使用模拟器或真机来运行程序。模拟器或真机运行程序的方法参见配套的视频教程。
图1-6 修改前、后程序的运行效果
下面我们分析一下添加的代码。
在添加的代码中,有一些注释。注释是对代码的说明和解释。注释中的文字不是有效的代码,在编译并执行程序时,所有注释都会被系统忽略。尽管注释不是有效的代码,但是其可以很好地对程序进行解释说明,是程序十分重要的组成部分。明确、简洁的注释能大大提高程序的可读性和可维护性。
ArkTS中的注释分为两种类型:单行注释(//)和多行注释(/*...*/)。
单行注释使用“//”表示,“//”之后的内容就是注释的内容。单行注释不能跨越多行。在代码中,请将单行注释放在相应代码的右侧或者上方。如果单行注释位于代码右侧,应该在代码和注释之间至少保留一个空格,以提高可读性。如果单行注释过长,请将其置于代码上方,并且与代码保持同样层级的缩进,如代码清单1-2中第18行的单行注释。
多行注释以“/*”开头,以“*/”结尾,“/*”和“*/”中间就是注释的内容,注释的内容可以跨越多行。对于多行注释,我们建议将其放在对应代码的上方,并让注释与代码保持一样的缩进层级,如代码清单1-2中第13~16行的多行注释(第14、15行开头的“*”不是必需的,添加“*”是为了增加注释的可读性)。如果是文件头注释,我们建议将其放在文件开头,不使用缩进。
在书写代码时,请注意代码的缩进。良好的缩进能大大提高程序的可读性。一般来说,一个层级的缩进是4个空格。UI中有时会使用较多的多层嵌套,这时会使用两个空格作为一个层级的缩进。本书主要介绍ArkTS语言,统一用4个空格作为一个层级的缩进。
在代码清单1-2中,通过链式调用一系列属性方法,我们设置了所添加按钮的样式,包括按钮的文字样式、大小、背景色和类型。相关代码如下:
Button('点我')
.fontColor(Color.White) // 设置按钮上的文字颜色为白色
.fontSize(40) // 设置按钮上的文字字号为40
.width(150) // 设置按钮的宽度为150
.height(70) // 设置按钮的高度为70
.backgroundColor(Color.Gray) // 设置按钮的背景色为灰色
.type(ButtonType.Capsule) // 设置按钮类型为胶囊按钮(圆角大小为按钮高度的一半)
// 其他代码略
只要单击页面上的“点我”按钮,就会触发Button组件的单击事件——对应的onClick事件方法被执行。相关代码如下:
Button('点我')
// 其他代码略
// onClick事件方法
.onClick((event: ClickEvent) => {
this.message = 'Hello ArkTS'; // 修改状态变量message的值为'Hello ArkTS'
})
在定义Text组件时,传入的参数为this.message(代码清单1-2的第9行),而此时message的值为'Hello World'(第4行),所以一开始页面的Text组件显示的文本为“Hello World”。在触发并执行了按钮的onClick事件方法之后,message的值被修改为'Hello ArkTS'。由于message是由@State装饰的状态变量,因此当message发生变化时,系统会自动刷新页面,将Text组件的文本显示为最新的message值“Hello ArkTS”。这就是ArkUI数据驱动的基本原理。
现在,我们已经了解了ArkTS语言的基本概念以及ArkUI的一些基础知识,包括组件、属性方法、事件方法等,接下来就可以正式学习ArkTS语言了。