Flutter入门第一步-Dart语言入门(三)
.
1.Dart中的异步支持
1.1 Future:
Future与JavaScript中的Promise非常相似,表示一个异步操作的最终完成(或失败)及其结果值的表示。简单来说,它就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作。一个Future只会对应一个结果,要么成功,要么失败。
.
1.2 Future.than
我们可以在than中接收异步结果,并进行相应的处理。下面这个例子中,我们模拟 一个耗时操作,然后在than中接收了异步的执行结果并打印了出来,代码如下:
Future.delayed(new Duration(seconds: 2),(){
return "hi world!";
}).then((data){
print(data);
});
.
1.3 Future.catchError
当我们的异步操作执行错误的时候,我们可以在catchError中进行一场捕获,然后进行相应的处理。在上例中,我们可以抛出一个错误,然后再catchError中进行处理,代码如下:
Future.delayed(new Duration(seconds: 2),(){
// return "hi world!";
throw AssertionError("aha!");
}).then((data){
print(data);
})
.catchError((e)
{
print(e);
});
.
1.4 Future.whenComplete
这个代表的含义几乎和finall类似,代表当异步执行结束之后,最终不管成功与否都会执行Future.whenComplete中的代码。
Future.delayed(new Duration(seconds: 2),(){
//return "hi world!";
throw AssertionError("Error");
}).then((data){
//执行成功会走到这里
print(data);
}).catchError((e){
//执行失败会走到这里
print(e);
}).whenComplete((){
//无论成功或失败都会走到这里
});
1.4 Future.wait
有时候在进行异步操作时,我们需要注意时序的问题。比如等两张图片全都加载结束了再关闭对话框,其中wait的参数是一个Furure类型的数组,然后再wait中执行的代码的结果会存在results数组中。代码如下:
Future.wait([
// 2秒后返回结果
Future.delayed(new Duration(seconds: 2), () {
return "hello";
}),
// 4秒后返回结果
Future.delayed(new Duration(seconds: 4), () {
return " world";
})
]).then((results){
print(results[0]+results[1]);
}).catchError((e){
print(e);
});
1.5 Async/await
想象这样一个场景,有一些操作必须是基于已经完成的操作的,但由于我们用了异步的操作,如果顺序调用就失去了时序性,只能在一个Future的than中再调用下一个Future,这样嵌套的层数多了以后,代码就失去了可读性和可维护性,dart将这种现象叫做Callback hell(回调地狱)。所以在Dart中,有别的办法进行这样的操作。我们看下面这段代码:
task() async {
try{
String id = await login("alice","******");
String userInfo = await getUserInfo(id);
await saveUserInfo(userInfo);
//执行接下来的操作
} catch(e){
//错误处理
print(e);
}
}
async用来表示函数是异步的,定义的函数会返回一个Future对象,可以使用then方法添加回调函数。
await 后面是一个Future,表示等待该异步任务完成,异步完成后才会往下走;await必须出现在 async 函数内部。
可以看到,我们通过async/await将一个异步流用同步的代码表示出来了。
其实,无论是在JavaScript还是Dart中,async/await都只是一个语法糖,编译器或解释器最终都会将其转化为一个Promise(Future)的调用链。
1.6 Stream
Stream 也是用于接收异步事件数据,和Future 不同的是,它可以接收多个异步操作的结果(成功或失败)。 也就是说,在执行异步任务时,可以通过多次触发成功或失败事件来传递结果数据或错误异常。 Stream 常用于会多次读取数据的异步任务场景,如网络内容下载、文件读写等。举个例子:
Stream.fromFutures([
// 1秒后返回结果
Future.delayed(new Duration(seconds: 1), () {
return "hello 1";
}),
// 抛出一个异常
Future.delayed(new Duration(seconds: 2),(){
throw AssertionError("Error");
}),
// 3秒后返回结果
Future.delayed(new Duration(seconds: 3), () {
return "hello 3";
})
]).listen((data){
print(data);
}, onError: (e){
print(e.message);
},onDone: (){
});
上边的代码会一次输出:
hello1,error,hello3
关于Dart的部分就到这里,在储备了这些知识以后,我们就可以真正的开始学习Flutter了,想想还有点小激动。从java来的coder一定要认真读一下代码,因为总的来说Dart和Java的思想是截然不同的。下篇文章我们正式开始Flutter之旅