Dart的异步操作
一起从0开始学习Flutter!
我们经常在开发的时候面临上传下载等耗时操作,这时候需要请我们的异步模块出场了,使用异步的目的是为了在我们在执行一段耗时代码的时候不至于UI卡主用户无法操作。
首先我们可以使用Future来帮助我们创建一个简单的异步请求。
Future<String> getData(){
return Future<String>((){//返回一个Future实例。
sleep(Duration(seconds: 3));//这是是用到了延时操作,让程序睡3秒。
return "获取到了数据";
});
}
在我们拿到这个Future之后就可以使用then方法来获取到里面的值。
print("testSyn start");
getData().then((value){ //这里调用getData()获取到的是Future对象,需要通过then方法来获取里面的值
print("value is $value");//打印获取到的值
});
print("testSyn end");
/*输出结果
testSyn start
testSyn end
value is 获取到了数据*/
这是一个简单的异步操作,如果在异步操作中出现了异常,我们还需要用catchError方法来捕获产生的异常,然后会异常进行处理操作。
Future<String> getNetData(){
return Future<String>((){
sleep(Duration(seconds: 3));
throw Exception("timeout exception");//过了三秒钟之后抛出一个连接超时的异常。
});
}
在调用出我们需要捕捉该异常:
print("testSyn start");
getNetData().then((value){
print("value is $value");
}).catchError((error){//在then方法后面直接抓取异常
print("error is $error");
});
print("testSyn end");
Future可以使用链式,每一次都是返回的一个Future来让后面的方法进行调用。
getData().then((value){
print("value is $value");
return "return future first";
}).then((value){
print("value is $value");
return "return future second";
}).then((value){
print("result is $value");
}).catchError((error){
print("error is $error");
});
print("testSyn end");
/*运行结果
value is 获取到了数据
value is return future first
result is return future second */
在我们日常使用中我们异步的调用需要使用await、async这两个关键字,这两个关键字都是同时出现的,在调用了await的方法上需要加上async关键字。
Future<String> getNetworkData() async {
var response = await getData();//去调用的getData方法并获取到了里面返回的值。
return "response is $response";
}
我们在main函数里的调用:
getNetworkData().then((value){
print(value);//response is 获取到了数据
});
再附上一段官网的示例,我们可以从中学到更多的用法:
void printOrderMessage () async {
print('Awaiting user order...');
var order = await fetchUserOrder();
print('Your order is: $order');
}
Future<String> fetchUserOrder() {
// Imagine that this function is more complex and slow.
return Future.delayed(Duration(seconds: 4), () => 'Large Latte');
}
Future<void>main() async {
countSeconds(4);
await printOrderMessage();
}
// You can ignore this function - it's here to visualize delay time in this example.
void countSeconds(s) {
for( var i = 1 ; i <= s; i++ ) {
Future.delayed(Duration(seconds: i), () => print(i));
}
}
/**运行结果为:
Awaiting user order...
1
2
3
4
Your order is: Large Latte
*/
Dart 的基础知识差不多就介绍完了,遗漏的部分可以在以后Flutter的学习中慢慢的再加入进来。又可以回到我们的Flutter的学习了。