最近在做Flutter网络这块,涉及到耗时操作,显然要用异步编程。在其他语言,比如java、c++等,会使用多线程来实现。而在Dart语言中,它是单线程+事件循环的设计模式,其中主要使用Future来实现异步操作,为了快速的了解Flutter的异步编程,需要熟练Futter的概念以及用法。
同步编程中,立即返回执行的结果或者抛出异常;而异步编程中,返回的是将要完成的结果未来。Future代表异步执行的未来。
var future = Future
上述代码在执行过程中,future是Future的一个实例,有两种状态,完成或者未完成。当调用异步方法的时候,返回的一个未完成的future对象,该对象等待方法中相关操作执行完成或者抛出异常。
void main() {
print('start......');
var future = getNetworkData();
print(future);
print('do other......');
}
Future getNetworkData() {
return Future(() {
//执行其他耗时操作
int result = 0;
for (int i = 0; i < 100000; i++) {
result += i;
}
return "result:$result";
});
}
打印结果:
start......
Instance of 'Future'
do other......
Future返回值:
Future 是一个泛型,其中T代表的是我们耗时操作返回的具体值,如果不需要返回值,可以使用Future。
获取耗时操作的返回值:
在Future中通过then回调方式取值:
void main() {
print('start......');
var future = getNetworkData();
future.then((value) => print(value));
print(future);
print('do other......');
}
执行结果:
start......
Instance of 'Future'
do other......
result:4999950000
异常处理使我们在开发中特别需要注意的,正确的处理程序运行中的异常,能给用户带来更好的体验。
在future中可以使用catchError()或在then()方法中传入可选参数onError,如下所示:
var future = getNetworkData();
future.then((value) {
print(value);
}, onError: (e) {
print(e);
});
//或者在catchError中处理异常
future.then((value) {
print(value);
}).catchError((e) {
print(e);
});
Future getNetworkData() {
return Future.delayed(const Duration(seconds: 3), () {
int result = 0;
for (int i = 0; i < 100000; i++) {
result += i;
}
//抛出异常
return throw Exception('this is ');
});
}
try/catch能够捕获future中的异常吗?
try{
var future = getNetworkData();
future.then((value) {
print(value);
});
}catch(e){
print(e);
}
运行上面的代码,控制台会输出以下信息:
Unhandled exception:
Exception: this is
#0 getNetworkData. (package:demo/test/test_async.dart:23:12)
#1 new Future.delayed. (dart:async/future.dart:393:39)
#2 Timer._createTimer. (dart:async-patch/timer_patch.dart:18:15)
#3 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:395:19)
#4 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:426:5)
#5 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)
根据提示信息,try/catch未能够捕获future中的异常,因此future中的异常只能通过catchError()或在then()方法中传入可选参数onError来进行捕获和处理。
作用:
使用demo如下:
Future printOrderMessage() async{
print('Awaiting user order...');
var order = await fetchUserOrder();
print('You order is:$order');
}
Future fetchUserOrder(){
return Future.delayed(const Duration(seconds: 2),(){
return 'Large Latte';
});
}
对于async中的方法的异常,我们按一下方式进行处理:
Future printOrderMessage() async{
print('Awaiting user order...');
try{
var order = await fetchUserOrder();
print('You order is:$order');
}catch (e){
print(e);
}
}
Future fetchUserOrder(){
return Future.delayed(const Duration(seconds: 2),(){
return throw Exception('handle order error');
});
}
对于async方法中的异常,需要通过try/catch进行处理。
最后,在初次接触Flutter、asnyc和await时,一定要深入了解其中用法以及处理方式,这样才能在后期的开发中得心应手。