在其他语言,比如java、c++中, 同时要执行多个任务可以使用多线程来实现。而在Dart语言中没有线程
和进程的概念 ,它是单线程+事件循环的设计模式,Dart和Flutter中要同时执行多个任务可以使用异步
来实现,Flutter中主要使用Future来实现异步操作 。
Future 返回值
Future 是一个泛型,其中T代表的是我们耗时操作返回的具体值,如Future 表示一个未来的字符串,
Future表示一个未来的布尔值,如果不需要返回值,可以使用Future。
- Future.value():返回一个指定值的Future
- Future.delayed():返回一个延时执行的Future
- Future(() { ... return ... }) 返回异步的function * 最多
Flutter自带的Demo中有个计数器的功能,我们想的是执行计数器方法的时候让程序并行的去执行另一
个统计的任务,这个时候就可以使用Future来完成。
Future<String> getNetworkData() {
return Future(() {
//执行其他耗时操作
int result = 0;
for (int i = 0; i < 100000; i++) {
result += i;
}
return "result:$result";
});
}
void _incrementCounter() {
getNetworkData().then((value) => print(value));
print("执行");
setState(() {
_counter++;
});
}
Future 处理异常
异常处理使我们在开发中特别需要注意的,正确的处理程序运行中的异常,能给用户带来更好的体验
在future中可以使用catchError()或在then()方法中传入可选参数onError 来处理异常,可以使用
whenComplete监听完成事件。
//抛出异常
Future<String> getNetworkData() {
Future.delayed(const Duration(seconds: 3));
return Future.error(Exception("this is error"));
}
//捕获异常
void _incrementCounter() {
getNetworkData()
.then((value) => print(value))
.onError((error, stackTrace) => {print(error)})
.whenComplete(() => print("完成"));
print("执行");
setState(() {
_counter++;
});
}
Future .then连缀来处理多个事务
Future<int> getNetworkData() {
return Future.value(12);
}
//处理
void _incrementCounter() {
getNetworkData()
.then((value){
return value*2; //12 * 2
})
.then((value) => print(value)) //打印24
.onError((error, stackTrace) => {
print(error) //打印异常
})
.whenComplete(() => print("完成"));
}
async和await关键字来处理future
作用:
- async:在方法体前面是使用,定义该方法为一个异步方法。
- await:等待并获得异步表达式的执行结果,并且给关键字只能在async修饰的方法中。
Future<int> getNetworkData(){
return Future.value(12);
}
//依次执行 async:把方法定义为异步 await:把异步改为同步
void _incrementCounter() async{
var retult =await getNetworkData(); //把异步改成同步 await必须用在async中
print(retult);
print("执行");
}
处理async方法中的异常
对于async中的方法的异常,我们按以下方式进行处理:
Future<int> getNetworkData() {
return Future.error(Exception("this is errot"));
}
void _incrementCounter() async {
try {
var retult = await getNetworkData();
print(retult);
} catch (e) {
print(e); //异常
}
}
浙公网安备 33010602011771号