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的面向对象。敬请期待。
转载自:https://juejin.cn/post/7020670356960575496