前言
总所周知,Flutter
程序是使用Dart
项目编写的,前文运行Flutter示例项目已经介绍了Flutter
项目在真机设备和模拟器上运行的方式。本文就来了解下Dart
的基础语法。
一: 新建项目
- 打开
Android Studio
选择New Flutter Project
。
- 选择
Flutter
/Dart
/Empty Porject
新建项目(选择Empty Porject
需要自己指定Dart
的Modules
,不推荐)。笔者这里选择的是Flutter
,因为可以查看Dart
相关API
,同时也是为了熟悉Flutter
项目环境。
- 根据情况和习惯设置项目名字和信息之后,点击
Finish
。
- 删除
main.dart
文件里除main
函数外的所有代码。下面我们就在main
函数里演练Dart
基础语法。
二: 变量和常量(var, final 和 const
)
Dart
一般使用var
声明变量(也可以直接指定数据类型声明变量),如果声明同时未初始化,类型为dynamic
,未初始化的变量为null
(即OC
中的nil
),后续可以给这个变量赋值任意类型,它会自动类型推导,同时也能参加运算等。
var
声明的变量,如果声明同时初始化,类型为赋值的值的数据类型,后续可以重新赋值同类型的值,但是不可赋值其他类型的值。
- 当然,声明变量时也可以直接指定数据类型,同样后续可以重新赋值同类型的值,但是不可赋值其他类型的值。这种方式声明的变量必须初始化(赋值)才能使用。
Dart
中使用final
声明只能赋值一次的变量,即最终变量。最终变量只要被赋值一次,就不可再被更改。
- 同时,最终变量必须初始化(赋值)才能使用。
Dart
使用const
声明常量,声明时可以指定类型,也可以不指定,不指定时类型为dynamic
,根据初始化的值自动类型推导,常量与变量最大的区别就是声明的时候必须初始化。当然了,常量是肯定不能被修改的。
三: 数值型(Number
)
Dart
里的数值型包括int
和double
,都继承自抽象类num
类型,如果指定数据类型声明,必须初始化(赋值)才能使用。
- 使用
num
声明的变量,可以赋值为int
类型和double
类型。
int
类型的变量,不可以赋值double
类型的值。
double
类型的变量,可以赋值类似10、5、666
这样省略.0
的值。但是也不能赋值int
类型的变量。
Dart
的算术运算符与其他语言差不多,但是有一个特殊的~/(取整)
。
int
和double
变量可以相互转换。
四: 字符串(String)
Dart
中的字符串使用单引号'
或双引号"
创建。
Dart
可以使用双引号"
或三引号'''
声明多行字符串。双引号声明的,每行后面需要有\n
,才能换行;三引号声明的,自动换行,且保留每行前的空格。
- 字符串可以使用
+
进行相加,使用*
完全拷贝一份添加到原来字符串后面。
- 字符串里可以使用
${}
添加表达式。
- 如果不需要表达式计算,直接使用
$
加上变量就可以了。
Dart
中转义字符如\n
等,占一个字符长度,如果字符串中需要包含\n
的话,可以在字符串前面加r
。
Dart
中获取字符串中某个字符和获取List
中元素一样,可以使用[i]
的方式获取。
关于字符串,还有其他一些
API
,有兴趣的可以自行探索。
五: List & Map
5.1 List
Dart
中的List
也分为可变和不可变,在[]
前面加上const
即为不可变list
,访问List
里的元素也是通过下标访问。
List
通过length
获取元素个数。可变List
可以进行增、插、删、改等操作;不可变List
不可进行增、插、删、改等操作。
List
可以很方便的从小到大进行排序,同时也可以根据需求指定自己的公式进行排序。
List
可以使用+
进行合并操作;使用sublist
可以进行List
的截取操作,范围包括start
,不包括end
。
关于
List
的其他API
,有兴趣的可以自行探索。
5.2 Map
Dart
中的Map
(键值对)也分为可变和不可变,在{}
前面加上const
即为不可变Map
,Map
通过key
获取或添加对应的value
。
Map
通过length
获取键值对个数。可变Map
可以进行增、删、改等操作;不可变Map
不可进行增、删、改等操作。
Map
可以很方便的获取所有key
和value
。同时List
也可以使用下标
为key
,元素为value
,转换为Map
。
关于
Map
的其他API
,有兴趣的可以自行探索。
六: 运算符??=
和??
Dart
中有两个特殊的运算符,赋值运算符??=
和条件表达式??
。
??=
表示当变量为null
时,对其进行赋值,如果不为null
,就不赋值。
??
表示如果左边有值,就返回左边的值,如果没有,就返回右边的值。
七: 函数
万物皆对象,Dart
中的函数也是对象,并且返回值和参数类型都可以省略(不建议省略,可读性会变差)。
7.1 箭头函数
- 当方法的执行语句只有一句的时候,可以使用
=>
表达式的箭头函数。
7.2 可选参数
Dart
的函数可以使用{}
定义可选参数,这种可选参数称为命名可选参数。可选参数可以为空,所以类型使用var
或者类型加?
来定义(如int?
),告诉编译器,开发者在函数里处理了可选参数为空的情况。当然可选参数类型也可以省略。调用函数传递命名可选参数的时候,必须带上形参的名字,顺序可与定义时不一样。
- 可选参数还可以指定默认值,这样函数里就不需要处理为空的情况了。
Dart
的函数还可以使用[]
来定义可选参数,这种可选参数称为位置可选参数。这种可选参数调用函数传参时不用带上形参名,且传值是按照顺序的。
7.3 函数作为参数
- 前面说过,
Dart
的函数也是对象,使用场景之一是作为函数的参数传递。
7.4 匿名函数
- 顾名思义,没有函数名的函数就是匿名函数。
- 为了解决匿名函数需要用变量保存,后续才可以调用的问题,立即执行函数就应运而生了。
- 匿名函数的主要作用就是作为函数的参数。
7.5 闭包
- 定义在函数里面的函数就是闭包,闭包也是一个对象。闭包可以访问外部函数的局部变量。闭包捕获的外部变量,只要闭包存在,就不会被释放。
总结
关于Dart
的基础语法,到这里就告一段落了。下篇文章探究下Dart
的面向对象。敬请期待。