泛型

泛型的好处

  • 适当地指定泛型可以更好地帮助代码生成。
  • 使用泛型可以减少代码重复。

使用集合字面量

List、Set 以及 Map 字面量也可以是参数化的。定义参数化的 List 只需在中括号前添加;定义参数化的 Map 只需要在大括号前添加 <keyType, valueType>:

Read More

类

隐式接口

每一个类都隐式地定义了一个接口并实现了该接口,这个接口包含所有这个类的实例成员以及这个类所实现的其它接口。如果想要创建一个 A 类支持调用 B 类的 API 且不想继承 B 类,则可以实现 B 类的接口。

扩展一个类

使用 extends 关键字来创建一个子类,并可使用 super 关键字引用一个父类:

重写类成员

子类可以重写父类的实例方法(包括 操作符)、 Getter 以及 Setter 方法。你可以使用 @override 注解来表示你重写了一个成员:

1
2
3
4
5
6
7
8
9
10
class Television {
// ···
set contrast(int value) {...}
}

class SmartTelevision extends Television {
@override
set contrast(num value) {...}
// ···
}
Read More

Mixin

定义

字面意思理解成混合,它可以混合多个类,达到多继承的效果。

当继承多个mixin,mixin内重写覆盖了同一个方法,则调用方法时会命中最后with的mixin对应的方法。如果需要链路调用,使用super。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
mixin A {
test() {
print('A');
}
}
mixin B {
test() {
print('B');
}
}

class C {
test() {
print('C');
}
}
/// 使用with关键字,后跟一个或多个mixin或者普通类
class D extends C with A, B {}

class E extends C with B, A {}


main() {
D d = D();
d.test();

E e = E();
e.test();
}

output:
B
A


class D extends C with A, B {}
可以理解成:
class CA = C with A;
class CAB = CA with B;
class D extends CAS {}
所以输出结果为B

class E extends C with B, A {}
class CB = C with B;
class CBA = CB with A;
class E extends CBA;
所以输出结果为A

on

on关键字用来限制mixin的使用,这个mixin只能使用在on指定的类或者其子类。

Read More

函数

Dart 是一种真正面向对象的语言,所以即便函数也是对象并且类型为 Function,这意味着函数可以被赋值给变量或者作为其它函数的参数。你也可以像调用函数一样调用 Dart 类的实例。

1
2
3
4
5
6
7
8
/// bool可以省略,但最好保留,提高可读性
bool isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}

//如果函数体内只包含一个表达式,你可以使用简写语法,称之为箭头函数
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;

在Java中,要实现回调,需要实现一个接口,在Dart中,只需要传递一个回调函数即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void setListener(Function listener){
listener("Success");
}
//或者
void setListener(void listener(String result)){
listener("Success");
}

//第三种:类型定义 将返回值为voide,参数为一个String的方法定义为一个类型。
typedef void Listener(String result);
void setListener(Listener listener){
listener("Success");
}

Read More