Dart基础语法

2,384 阅读6分钟

前言

总所周知,Flutter程序是使用Dart项目编写的,前文运行Flutter示例项目已经介绍了Flutter项目在真机设备和模拟器上运行的方式。本文就来了解下Dart的基础语法。

一: 新建项目

  • 打开Android Studio选择New Flutter Project

image.png

  • 选择Flutter/Dart/Empty Porject新建项目(选择Empty Porject需要自己指定DartModules,不推荐)。笔者这里选择的是Flutter,因为可以查看Dart相关API,同时也是为了熟悉Flutter项目环境。

image.png

  • 根据情况和习惯设置项目名字和信息之后,点击Finish

image.png

  • 删除main.dart文件里除main函数外的所有代码。下面我们就在main函数里演练Dart基础语法。

image.png

二: 变量和常量(var, final 和 const)

  • Dart一般使用var声明变量(也可以直接指定数据类型声明变量),如果声明同时未初始化,类型为dynamic,未初始化的变量为null(即OC中的nil),后续可以给这个变量赋值任意类型,它会自动类型推导,同时也能参加运算等。

image.png

  • var声明的变量,如果声明同时初始化,类型为赋值的值的数据类型,后续可以重新赋值同类型的值,但是不可赋值其他类型的值。

image.png

  • 当然,声明变量时也可以直接指定数据类型,同样后续可以重新赋值同类型的值,但是不可赋值其他类型的值。这种方式声明的变量必须初始化(赋值)才能使用。

image.png

  • Dart中使用final声明只能赋值一次的变量,即最终变量。最终变量只要被赋值一次,就不可再被更改。

image.png

  • 同时,最终变量必须初始化(赋值)才能使用。

image.png

  • Dart使用const声明常量,声明时可以指定类型,也可以不指定,不指定时类型为dynamic,根据初始化的值自动类型推导,常量与变量最大的区别就是声明的时候必须初始化。当然了,常量是肯定不能被修改的。

image.png

三: 数值型(Number)

  • Dart里的数值型包括intdouble,都继承自抽象类num类型,如果指定数据类型声明,必须初始化(赋值)才能使用。

image.png

  • 使用num声明的变量,可以赋值为int类型和double类型。

image.png

  • int类型的变量,不可以赋值double类型的值。

image.png

  • double类型的变量,可以赋值类似10、5、666这样省略.0的值。但是也不能赋值int类型的变量。

image.png

image.png

  • Dart的算术运算符与其他语言差不多,但是有一个特殊的~/(取整)

image.png

  • intdouble变量可以相互转换。

image.png

四: 字符串(String)

  • Dart中的字符串使用单引号'或双引号"创建。

image.png

  • Dart可以使用双引号"或三引号'''声明多行字符串。双引号声明的,每行后面需要有\n,才能换行;三引号声明的,自动换行,且保留每行前的空格。

image.png

  • 字符串可以使用+进行相加,使用*完全拷贝一份添加到原来字符串后面。

image.png

  • 字符串里可以使用${}添加表达式。

image.png

  • 如果不需要表达式计算,直接使用$加上变量就可以了。

image.png

  • Dart中转义字符如\n等,占一个字符长度,如果字符串中需要包含\n的话,可以在字符串前面加r

image.png

  • Dart中获取字符串中某个字符和获取List中元素一样,可以使用[i]的方式获取。

image.png

关于字符串,还有其他一些API,有兴趣的可以自行探索。

五: List & Map

5.1 List

  • Dart中的List也分为可变和不可变,在[]前面加上const即为不可变list,访问List里的元素也是通过下标访问。

image.png

  • List通过length获取元素个数。可变List可以进行增、插、删、改等操作;不可变List不可进行增、插、删、改等操作。

image.png

  • List可以很方便的从小到大进行排序,同时也可以根据需求指定自己的公式进行排序。

image.png

  • List可以使用+进行合并操作;使用sublist可以进行List的截取操作,范围包括start,不包括end

image.png

关于List的其他API,有兴趣的可以自行探索。

5.2 Map

  • Dart中的Map(键值对)也分为可变和不可变,在{}前面加上const即为不可变MapMap通过key获取或添加对应的value

image.png

  • Map通过length获取键值对个数。可变Map可以进行增、删、改等操作;不可变Map不可进行增、删、改等操作。

image.png

  • Map可以很方便的获取所有keyvalue。同时List也可以使用下标key,元素为value,转换为Map

image.png

关于Map的其他API,有兴趣的可以自行探索。

六: 运算符??=??

Dart中有两个特殊的运算符,赋值运算符??=和条件表达式??

  • ??=表示当变量为null时,对其进行赋值,如果不为null,就不赋值。

image.png

  • ??表示如果左边有值,就返回左边的值,如果没有,就返回右边的值。

image.png

七: 函数

万物皆对象,Dart中的函数也是对象,并且返回值和参数类型都可以省略(不建议省略,可读性会变差)。

7.1 箭头函数

  • 当方法的执行语句只有一句的时候,可以使用=>表达式的箭头函数。

image.png

7.2 可选参数

  • Dart的函数可以使用{}定义可选参数,这种可选参数称为命名可选参数。可选参数可以为空,所以类型使用var或者类型加?来定义(如int?),告诉编译器,开发者在函数里处理了可选参数为空的情况。当然可选参数类型也可以省略。调用函数传递命名可选参数的时候,必须带上形参的名字,顺序可与定义时不一样。

image.png

  • 可选参数还可以指定默认值,这样函数里就不需要处理为空的情况了。

image.png

  • Dart的函数还可以使用[]来定义可选参数,这种可选参数称为位置可选参数。这种可选参数调用函数传参时不用带上形参名,且传值是按照顺序的。

image.png

7.3 函数作为参数

  • 前面说过,Dart的函数也是对象,使用场景之一是作为函数的参数传递。

image.png

7.4 匿名函数

  • 顾名思义,没有函数名的函数就是匿名函数。

image.png

  • 为了解决匿名函数需要用变量保存,后续才可以调用的问题,立即执行函数就应运而生了。

image.png

  • 匿名函数的主要作用就是作为函数的参数。

image.png

7.5 闭包

  • 定义在函数里面的函数就是闭包,闭包也是一个对象。闭包可以访问外部函数的局部变量。闭包捕获的外部变量,只要闭包存在,就不会被释放。

image.png

总结

关于Dart的基础语法,到这里就告一段落了。下篇文章探究下Dart的面向对象。敬请期待。