本文首发于个人博客
前言
- Dart是谷歌开发的计算机编程语言,后来被Ecma (ECMA-408)认定为标准 。它被用于web、服务器、移动应用和物联网等领域的开发。它是宽松开源许可证(修改的BSD证书)下的开源软件。
- Dart是面向对象的、类定义的、单继承的语言。它的语法类似C语言,可以转译为JavaScript,支持接口(interfaces)、混入(mixins)、抽象类(abstract classes)、具体化泛型(reified generics)、可选类型(optional typing)和sound type system
Google为Flutter选择了Dart作为开发语言
关于Dart的环境安装和配置这里就不赘述了。
新建程序
用VSCode新建一个Dart文件,默认是如下代码
1 | main(List<String> args) { |
其实这也和Java,C等等其他语言一样,main函数作为入口。
- Dart语言的入口也是main函数,并且必须显示的进行定义;
- Dart的入口函数main是没有返回值的;
- 传递给main的命令行参数,是通过List
完成的。 - 从字面值就可以理解List是Dart中的集合类型。
- 其中的每一个String都表示传递给main的一个参数;
- 定义字符串的时候,可以使用单引号或双引号;
- 每行语句必须使用分号结尾,很多语言并不需要分号,比如Swift、JavaScript;
变量
明确声明(Explicit)
明确声明变量的方式, 格式如下:
1 | 变量类型 变量名称 = 赋值; |
示例代码:
1 | String name = 'eagle'; |
注意: 定义的变量可以修改值, 但是不能赋值其他类型
1 | String content = 'Hello World'; |
类型推导(Type Inference)
和swift等语言类似,Dart也是支持类型推导的,类型推导声明变量的方式, 格式如下:
1 | var/dynamic/const/final 变量名称 = 赋值; |
var的使用
var的使用示例:
- runtimeType用于获取变量当前的类型
1 | var name = 'eagle'; |
var的错误用法:
1 | var age = 18; |
dynamic的使用
如果确实希望这样做,可以使用dynamic来声明变量:
- 但是在开发中, 通常情况下不使用dynamic, 因为类型的变量会带来潜在的危险
1 | dynamic name = 'eagle'; |
final&const的使用
final和const都是用于定义常量的, 也就是定义之后值都不可以修改
1 | final name = 'eagle'; |
final和const的区别
const在赋值时, 赋值的内容必须是在编译期间就确定下来的
final在赋值时, 可以动态获取, 比如赋值一个函数
1 | String getName() { |
final和const小案例:
- 首先, const是不可以赋值为DateTime.now()
- 其次, final一旦被赋值后就有确定的结果, 不会再次赋值
1 | // const time = DateTime.now(); // 错误的赋值方式 |
const放在赋值语句的右边,可以共享对象,提高性能:
1 | class Person { |
数据类型
数字类型
int
和double
对于数值来说,我们也不用关心它是否有符号,以及数据的宽度和精度等问题。只要记着整数用int
,浮点数用double
就行了。
不过,要注意的是Dart
中的int
和double
可表示的范围并不是固定的,它取决于运行Dart的平台。
1 | // 1.整数类型int |
字符串和数字之间的转化
1 | // 字符串和数字转化 |
布尔类型
布尔类型中,Dart提供了一个bool的类型, 取值为true和false
1 | // 布尔类型 |
注意: Dart中不能判断非0即真, 或者非空即真
Dart的类型安全性意味着您不能使用if(非booleanvalue)或assert(非booleanvalue)之类的代码。
1 | var message = 'Hello Dart'; |
字符串类型
Dart字符串是UTF-16编码单元的序列。您可以使用单引号或双引号创建一个字符串:
1 | // 1.定义字符串的方式 |
可以使用三个单引号或者双引号表示多行字符串:
1 | // 2.表示多行字符串的方式 |
字符串和其他变量或表达式拼接: 使用${expression}
, 如果表达式是一个标识符, 那么{}
可以省略
1 | // 3.拼接其他变量 |
集合类型
- 集合类型的定义
对于集合类型,Dart则内置了最常用的三种:List / Set / Map
。
其中,List
可以这样来定义
1 | // List定义 |
其中,set
可以这样来定义:
其实,也就是把[]换成{}就好了。
Set和List最大的两个不同就是:Set是无序的,并且元素是不重复的。
1 | // Set的定义 |
最后,Map是我们常说的字典类型,它的定义是这样的:
1 | // Map的定义 |
集合的常见操作
了解了这三个集合的定义方式之后,我们来看一些最基础的公共操作
第一类,是所有集合都支持的获取长度的属性length:
1 | // 获取集合的长度 |
第二类, 是添加/删除/包含操作
并且,对List来说,由于元素是有序的,它还提供了一个删除指定索引位置上元素的方法
1 | // 添加/删除/包含元素 |
第三类,是Map的操作
由于它有key和value,因此无论是读取值,还是操作,都要明确是基于key的,还是基于value的,或者是基于key/value对的。
1 | // Map的操作 |