Stream

Stream 是一系列异步事件的序列。其类似于一个异步的 Iterable,不同的是当你向 Iterable 获取下一个事件时它会立即给你,但是 Stream 则不会立即给你而是在它准备好时告诉你。

Stream的类型:

  • Single-Subscription

Read More

泛型

泛型的好处

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

使用集合字面量

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

函数

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