导图社区 Dart 语言概述(第一部分)
由 Dart 官方语言教程总结而来,分为两部分,此为第一部分,主要包含 Dart 的基本语句、变量、运算符、函数等内容。
编辑于2022-07-30 14:36:33Dart (Part I)
语法
缩进:使用2个空格 : (
语句:语句结尾必须有分号
注释:使用 // 和 /**/ 作为普通注释,使用 /// 和 /** [此处为内容] */ 作为文档注释
文档注释的参考文档:https://dart.cn/guides/language/effective-dart/documentation
* 使用 typedef 声明别名,例:typedef IntList = List<int>;
变量相关
* 所有的变量引用都是 对象,在 Dart 中,也是“万物皆对象”的思想(null 除外);同时,所有的类都继承于 Object
类型
Dart 为强类型语言
变量声明
var foobar = ""; // 类型推断String foobar = ""; // 显式声明
* 若想声明一个可以任意更改类型的变量,可以使用 dynamic 关键字或使用 Object 作为类型
* 根据 风格建议指南,使用 var 声明局部变量,而不是使用指定类型(当然,有些情况下仍需指定类型,https://dart.cn/guides/language/effective-dart/design#do-type-annotate-variables-without-initializers)
* late 关键字用于使变量仅在其使用时才初始化,这对于一些可能用不到的变量将非常有用(注意:若要实现该效果,应在声明时便给出初始化的值,例如 late String foobar = somethingMayConsumeALot(); )
空安全(类似于Swift中的可选)
未初始化和可空类型的变量默认为 null;可空类型与 Swift 一样,为类型加问号,例如:Object?
注意在使用前一定要确认一个变量是否为空,Dart虽然不会像Swift一样会终止程序(因为实现了默认的错误处理),但是这很危险
常量和不可更改的变量
同其他语言一样,声明一个 常量 的语法为 const String foobar = ": )"; // 类型指定也可以省去
const 也可以由另一个 const 推导而来,例如 const a = 1; const b = 2 * a;
const 还有一个其他语言不常见的用法——创建 常量值,可在 https://dart.cn/guides/language/language-tour#final-and-const 查看例子,这在 Flutter 中也非常常用。估计这种语法应该是用来进行编译时优化 https://stackoverflow.com/questions/26957666/meaning-of-const-in-const-foo-bar-in-dart
不可更改的变量指 final 变量,其只能赋值一次,并且在第一次使用时才被初始化,其语法为 final MyClass foobar = MyClass(); // 类型指定可以省去
注意注意:final 在 Flutter 中经常使用,一定要弄懂!
* final 和 const 的区别:const 是指 编译时 就已经确定的,例如 const pi = 3.14;final 是 运行时 确定,但确定后不会改变的,例如从数据库获取一条只读信息
在一个类中,实例变量可以是 final 但不可以是单独的 const,若要用 const 修饰类中的变量,要加上 static 关键字,即 static const 这样组合使用
内置类型
Numbers
可以使用 int.parse() 或 double.parse() 来由字符串转为数字
Strings
可以使用单引号也可以使用双引号来创建字符串;把两个字符串放在一起或使用三个引号或使用加号来创建多行字符串
在字符串中使用 $foobar 或 ${表达式} 来插值
在字符串前加 r 来创建raw字符串
* 为了方便处理 Unicode,Dart 引入了 Runes
Lists(Arrays)
向一个类型明确的列表加入非同类的对象会报错
Dart 中的集合类型都支持尾随逗号,即最后一个逗号会被忽略例如:var list = [1, 2, 3,]; 是合法的
Dart 中有 扩展操作符(...)和(...?),用来将一个集合插入另一个集合中例如:var list1 = [1, 2, 3,]; var list2 = [0, ...list1]; // ...? 在插入的集合可能为 null 时使用
在集合中也可以使用控制流 if 和 for,例如:var foobar = ["A", "B", "C", if (needsD) "D"]; var baz = [for (var foo in foobar) "#$foo"];
Sets
使用 {} 创建,但默认 {} 创建的是一个 Map<dynamic, dynamic> 对象
Maps
注意:在 Dart 中,new 是可选的,并且通常不建议使用
运算符
算术运算符+-*%与其他语言无异,但是 / 的结果为 double,~/ 才是取整除
自增自减 ++、 --
关系运算符 ==、!=、>、<、>=、<=与其他语言无异
* 极少数情况下,可能需要 identical() 来代替==判断两个对象是否完全相同
类型判断运算符:as 用于类型转换、is 如果对象为指定类型则为 true、is! 如果对象为指定类型则为 false
注意,在使用 as 转换前,务必确认该对象为目标类型,若不确定,则使用 is 检查,否则会抛出异常
赋值运算符 =、+=、-=等,若要为值为 null 的变量赋值,也可使用 ??= (但事实上很鸡肋? : ()
逻辑运算符 !、||、&&与其他语言无异
按位和位移运算符 &、|、^、~、>>、<<与其他语言无异,但是多了一个无符号右移 >>>
条件表达式,三目 condition ? expression1 : expression2 与其他语言无异expression1 ?? expression2 则用来当 expression1 为 null 时使用 expression2
* 级联运算符 .. 和 ?.. (用于可能为 null 的对象)使得可以在同一个对象上连续调用对象的多个变量和方法例如:var paint = Paint() ..color = Colors.black ..strokeCap = StrokeCap.round;等同于var paint = Paint();paint.color = Colors.black;paint.strokeCap = StrokeCap.round;
根据风格指南,这是代替返回 this 的一个方案
其他运算符:() 调用方法、[] 访问List、?[] 先判断 List 是否为空再访问、. 访问成员、?. 先判空再访问、! 断言不为空
* 根据 Swift 的经验, 断言操作符 ! 应当少用,除非十分确定,否则可能会抛出异常
函数
在Dart中,函数也是对象,且类型为 Function
语法 ReturnValue funcName(parameters) { }
* ReturnValue 是可选的,即可写可不写,但是根据风格建议,仍然应该明确该类型
箭头函数
箭头函数为普通函数的简写,与其他语言不同,其主体只能为一个表达式,不能有语句
语法 ReturnValue funcName(parameters) => 表达式;(为 ReturnValue funcName(parameters) { return 表达式; } 的简写)
参数
必要参数和可选参数
可选的位置参数,在参数外加上中括号,例如 foobar(bool a, [bool b = true, bool? c ]) { }
可选的位置参数的类型应为可选类型,除非被标记为 required 或者提供一个默认值
命名参数和位置参数
命名参数语法,在参数外加上大括号,例如 foobar(bool a, { required bool b, bool? c }) { }此时可以用 foobar(b: true, c: false, true); 来调用
命名参数默认为可选参数,其类型必须为可选类型,除非被标记为 required 或者提供一个默认值
匿名函数
与普通的函数类似,但是无需写返回值类型和函数名
所有函数都有一个返回值,未显式声明返回语句时最后为 return null;