数据类型
Dart 中常用的数据类型有:number、bool、string、list、map 等。
number
Dart 中 number 类型分为:int、double。其中
- int 类型对应 Java 中的 int 和 long。
- double 类型:64位双精度浮点数。
var x = 1;
var hex = 0x12345678;
// ↑↑↑ 不包含小数点,int 类型
// ↓↓↓ 包含小数点,double 类型
var x = 1.1;
var exponents = 1.42e5
ps:Dart 中没有 float 类型。
bool
Dart 中 bool 类型只包括 true 和 false。不支持 null、0、1等类型的判断。
string
与 Java 相同,Dart 中 string 对象包含一系列 UTF-16 代码单元。可以使用 '' 或 "" 来创建 string 对象。
string 对象支持使用 +
或者
进行字符串拼接,也支持 ${value}
表达式 。
var s = '单引号' "双引号" + "+" + "引号'嵌套'";
var s = """
第一行
第二行
第三行
""";
var s = 's: $s , upper: ${s.toUpperCase()}';
List
Dart 中 List 即数组
,数组中可存放不同类型的对象。
var list = [];
var list = new list();
var list = [1, "2", null];
Dart 同样支持扩展运算符...
、...?
。
var list = [1, 2, 3];
var list2 = [0, ...?list];
Map
使用方式基本与 kotlin 一致。
变量
Dart 可以使用 var 和 dynamic 来声明变量。使用 var 声明变量时,编译期会自动推导出数据类型。使用 dynamic 来声明动态类型,编译期为 object 类型,运行期进行类型检查。
var a = 1;
var b = "2";
var c = true;
var d = {};
dynamic e = 1;
dynamic f = "2";
final、const 用来声明常量,static const 用来声明静态常量。const 在编译期确定值,final 在运行期确定值。所以,使用 const 声明常量时,必须在定义时进行赋值,final 则不必。
const g = "g";
final h = {"h", "i"};
static const j = "j";
与 kotlin 类似,Dart 变量自带 getter、setter 方法,当变量被 final 或 const 声明时,只有 getter 方法。
函数
Dart 中万物皆对象,所以函数也是一种对象,对象类型为 Function。
Dart 中没有 public、private 修饰符,以_
开头的函数直接代表 private。Dart 中函数可以使用 @Protect 注解。
参数
函数中可以有任意数量个必选参数,后面可以跟有任意数量的命名参数或可选参数。
命名参数
命名参数是可选的,除非已将其明确标记为必填项。
定义函数时,使用 {param1,param2,…} 指定命名参数,调用函数时,使用paramName:value 指定命名参数。
// 定义
void enableFlags({bool? bold, bool? hidden}) {
// ...
}
// 调用
enableFlags();
enableFlags(bold: true, hidden: false);
可选参数
在参数外包裹一层[]
,可以将其标记为可选参数。
// 定义
String say(String from, String msg, [String? device]) {
// ...
}
// 调用
say('Bob', 'Howdy')
say('Bob', 'Howdy', 'smoke signal');
参数默认值
使用=
定义参数的默认值。默认值必须是编译时常量,如果未提供默认值,则默认值是 0。
// 定义命名参数的默认值
void enableFlags({bool bold = false, bool hidden = false}) {
// ...
}
// 调用
enableFlags(bold: true);
注意:命名参数和可选参数不能同时使用在一个函数内。
// 定义可选参数的默认值
String say(String from, String msg, [String device = 'carrier pigeon']) {
...
}
// 调用
say('Bob', 'Howdy');
Dart 中可被 const 修饰的数据类型均可作为参数的默认值进行传递。
构造函数
同 Java 一样,在未声明构造函数时,Dart 会提供默认的无参构造函数。不同的是,子类不会从父类继承构造函数,相当于父类的构造函数被标上了 @inherited 注解。
命名构造函数
Dart 支持对声明的构造函数进行命名,方法名称可以随意设置。
class A {
String name;
A.init(this.name);
// A.init(); error
}
class B extends A {
B.init(String name) : super.init(name);
}
void main() {
var b = B.init("b");
print(b.name);
}
-
子类不会继承父类的命名构造函数,当需要使用父类定义的命名函数来创建子类,则必须在子类中实现该命名构造函数。
-
命名构造函数不可被重载。
混合继承
不同于 Java,Dart 支持混合继承。使用with关键字,后跟一个或多个 mixin 名称,即可在多个类层次结构中重用类代码。
class A extends B with C {
// ···
}
mixin B {
bool b = false;
}
- 若被混合继承的类,不会作为一个常规类被创建实体对象,推荐使用
mixin
关键字替代class
,并且不声明构造函数。 - 类的无参构造函数执行有先后顺序:B -> C -> A
运算符
除常规的运算符外,Dart 也支持部分特殊的运算符。
条件表达式
Dart 有两种快速实现 if-else 判断的条件表达式,分别为?
和??
。
condition ? expr1 : expr2
与 Java 中三目运算符相同,如果条件为 true,则求值 expr1(并返回其值);否则为 false,求值并返回expr2的值。
expr1 ?? expr2
如果 expr1 不为 null,则返回其值;否则,求值并返回 expr2 的值。
该运算符同样支持赋值语句expr1 ??= expr2
,当且仅当 expr1 为 null 时,为其赋 expr2 的值。
控制流表达式
Dart 中的控制流表达式与 Java 中的大同小异,主要在 switch-case 中有些差异。
switch-case
- switch 支持 string。
- 支持使用 continue + tag,来执行指定的 case 语句。
级联操作符
..
允许对同一对象执行一系列操作。除了函数调用,还可以访问同一对象上的字段。
getPaint()
?..color = Colors.black
..strokeCap = StrokeCap.round
..strokeWidth = 5.0;
?..
短路级联可以对级联操作的对象进行判空,避免异常的发生。
常用的 Dart 语法就这些,后续有需要会进行更新。不得不说,Dart 老缝合怪了。。。
参考
https://dart.dev/guides/language/language-tour