前言
总所周知,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的面向对象。敬请期待。