dart基础3

1.异步支持,在dart中有很多返回Future和Stream对象的函数,这些函数在设置完耗时任务之后就立即返回了,不会等待耗时任务完成。使用async和await关键字可以让我们像编写同步代码一样实现异步操作。

2.如何获得Future的返回结果,具有两种方式,分别是使用async和await;使用Future API。可以使用try…catch…来捕获代码中使用await所导致的错误。首先看看第一种方式:

1
2
3
4
5
6
7
Future checkVersion() async {
try {
var version = await lookUpVersion();
} catch(e) {

}
}

3.声明异步函数,使用async声明函数并且返回值是Future。

1
Future<String> lookUpVersion() async => '1.0.0'; // 需要注意async修饰符的位置

4.同样,对于Stream对象来说,他也是一种异步操作,如果想获取他的返回值的话,那么也有两种方式:分别是使用await(await for)和Stream API。

5.可调用类,通过给类实现一个call方法,能够让类所实例化出来的对象被调用。如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class callable {
final int a;

callable(this.a);

void consoleA() { print('a is $a'); }

call(String a, String b, String c) => '$a $b $c';
}
void main() {
let cb = callable(3);
cb.consoleA(); // a is 3
let ret = cb('7', '8', '9');
print('ret is $ret');
}

6.typedef类型定义,考虑下面这个场景:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class SortCollection {
Function compare;

SortCollection(int f(Object a, Object b)) {
compare = f;
}
}

int sort(Object a, Object b) => 0;

void main() {
SortCollection sc = SortCollection(sort);
assert(sc.compare is Function);
}

对于上面这个例子,当把f赋值给compare的时候,f的类型信息(Object, Object) -> int(rust写法)被丢弃了,此时compare的类型信息为Function。为了避免这种类型丢失的情况,可以像下面这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef Compare = int Function(Object a, Object b);

class SortCollection {
Compare compare;

SortCollection(this.compare);
}

int sort(Object a, Object b) => 0;

void main() {
SortCollection coll = SortCollection(sort);
// 这样做的话coll.compare类型信息便没有丢失
}

typedef和泛型结合在一起:

1
2
3
4
5
6
7
typedef Compare<T> = int Function(T a, T b);

int sort(int a, int b) => a - b;

void main() {
assert(sort is Compare<int>);
}