此文章来自 B站视频教程 传送门
介绍
Dart 致力于打造漂亮且高质量的跨屏体验
- 针对客户端开发优化
- 丰富而强大的框架
- 令人愉悦且灵活的工具
安装
- 一般跟随框架安装,比如Flutter
- 可通过DartPad 在线编写和运行代码
重要概念
- 一切变量都是对象,包括数字、函数和null
- 对象是类的实例,所有类都继承与Object
- 强类型但支持类型推断
- 如果不想指定具体类型可以使用 dynamic
- 支持泛型,比如List<int> 或 List<dynamic>
支持顶层函数、类方法、实例方法和嵌套函数
- 顶层函数:例如:
main
就是顶层函数 - 类方法:要通过类名来调用
- 实例方法:要通过类的实例对象来调用
- 嵌套函数:在函数内嵌套函数
- 顶层函数:例如:
支持顶层变量、类变量、实例变量和局部变量
- 类变量和实例变量同上
以下划线( _ )开头的变量为私有,只能在库 (library)内部使用
- 私有:对外不公开,不可使用
标识符只能以字母或下划线开头,后面跟任意多个字母、数字或下划线字符
- 标识符:变量名、函数名、类名、方法名...
- 表达式在运行时可以求值,而语句不行
- 代码问题分为 warning 和 error 两种,warning不会阻止程序运行,但 error 会
- error 分为编译时错误和运行时错误两种,运行时错误会导致抛出异常
变量
- 变量类型可以自动推断,或者显示指定
- 未初始化的变量其值都为 null,包括数字
- 如果某个变量的值在定义后不会再改变,那就声明未 final 或 const
- final 和 const 变量只能赋值一次,但 const 变量的值需要在编译时就能确定,final 的值可以在运行的时候确定
- final 和 const 变量必须在其定义时就完成初始化,因为他们只能赋值一次,如果在定义的时候不初始化,那么他么的值就永远为 null
- const 变量的值必须为编译时常量,包括数字和字符串字面量、其他常量或算数运行结果
- const 除了用来声明变量,也可用来声明值、也就是常值
- 初始化 const 变量时可以省去值前面的 const,因为 const 变量的值肯定得是一个常值
- 常值用来防止内容变化,常量用来避免变量寻值,final 常量用来提升代码安全性
内置对象
数字 (num)
- num 是 int 和 double 的基类
- int 为 64 位整数,double 为 64 位浮点数
- num 和 int 是 double 的基类
字符串 (String)
- 字符串是 UTF-16 码元 (Code Unit)序列,每个Unicode 字符映射为1个或2个码元
- 字符串字面量可以使用单引号或双引号
- 使用 ${expression} 来插入变量值,如果 expression 是个合法的标识符,则可以省去 {}
- 使用毗连字符串常量或者 + 操作符来拼接字符串
- 使用三重引号来定义多行字符串
- 使用 r 前缀来声明原始字符串,其内不作字符转义
- 只要内部插入的表达式为编译时常量,则字符串字面量为编译时常量
布尔 (bool)
- 只有两个值 true 和 false,都是编译时常量
- 在需要布尔类型的地方必须使用布尔值
列表 (List)
- 列表就是其他语言里的数组,用来表示对象序列
- 列表索引序号从 0 开始,直到 list.length - 1
- 在列表字面量前使用 const 来声明常值
- 使用 [] 操作符来操作列表元素
哈希表 (Map)
- 哈希表用来关联键和值,键和值可以是任意类型的对象,但键必须唯一
- 使用 [] 操作符来操作哈希表的值
- 在哈希表字面量前使用 const 来声明常值
符文 (Rune)
- Rune 是由 UTF-32 码点 (Code Point)组成的字符串,一个 Rune 字符对应一个 Unicode字符
- 码点一般使用 4 个十六进制字符 uXXXX 来表示,如果超过4个,则需要使用 {}
- 字符串 和 Rune 直接可互相转换
函数
- 函数也是一种对象,类型为Function
- 函数参数和返回值类型可以省略,以支持动态类型
- 如果函数体只包含一个表达式,可使用箭头语法来定义
可选参数
- 可选命名参数使用{}来指定,并可使用注解 @required 标注为必须
- 可选位置参数使用 [] 指定
- 可选参数默认值使用 = 来指定,如为指定则默认值为null
- 每个程序都应有个位于顶层的 main函数,它是程序入口
- 函数可作为函数参数值,也可赋值给变量
- 可定义匿名函数,一般作为函数参数值或赋值给变量
- 变量作用域静态确定,也就是同代码布局,每对大括号定义一个作用域,嵌套大括号定义嵌套作用域
- 闭包是一个能访问其外层作用域变量的函数,即便该函数在其他地方被调用
- 如果函数没有指定返回值,则默认返回null,如果确实不想返回任何值,则可指定返回类型为void
关键字
基本数据类型
Dart的基本数据类型包括Number、String、Boolean、List、Set、Map、 Symbol、Runes。
Number
number类型为两类:
- int:整数值不大于64位,具体取决于平台。在Dart VM上,值可以是-2 ^63到2 ^63 - 1,如果编译为JavaScript,允许值为-2^53 to 2^53 - 1。
- double:64-bit (双精度) 浮点数,符合 IEEE 754 标准。
String
Dart 字符串是 UTF-16 编码的字符序列。 可以使用单引号或者双引号来创建字符串:
var s1 = '单引号适用于字符串文字';
var s2 = "双引号同样有效";
可以在字符串中使用表达式,用法是: ${expression}
。如果表达式是一个标识符,可以省略 {}。
var s = '乾坤大挪移';
assert('张无忌的$s' ==
'张无忌的乾坤大挪移');
使用三个单引号或者三个双引号可以创建多行字符串对象:
var s1 = '''
第一行
第二行
''';
var s2 = """第一行
第二行""";
Boolean
Dart是强bool类型检查,只有true对象才被认为是true。
var name = '张无忌';
if (name) {
print('明教教主');
}
上面的代码编译不能通过,因为name是一个字符串,而不是bool类型。
List
下面是一个List 的示例:
var list = [1, 2, 3];
List的第一个元素的索引是0,最后一个元素的索引是 list.length - 1 。
var list = [1, 2, 3, 4, 5, 6];
print(list.length);
print(list[list.length-1]);
Set
Dart中的Set是一组无序的集合。
var hero = ['张无忌', '风清扬', '张三丰', '独孤求败', '萧峰'];
要创建一个空集,可以在{}前面带有类型参数:
var heros= <String> {};
使用add()或addAll()方法将条目添加到现有集中:
var heros = <String>{};
heros.add('石破天');
heros.addAll(hero);
Map
Map是一个键值对相关的对象,键和值可以是任何类型的对象,每个键都是唯一的,而一个值则可以出现多次。
var player= {
// Keys Values
'20' : '斯诺',
'3': '艾弗森',
'40' : '希尔',
'8' : '麦基',
'55' : '穆托姆博'
};
使用Map构造函数也可以实现同样的功能:
var player = new Map();
player['20'] = '斯诺';
player['3'] = '艾弗森';
player['40'] = '希尔';
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。