在其他语言,比如java、c++中, 同时要执行多个任务可以使用多线程来实现。而在Dart语言中没有线程 和进程的概念 ,它是单线程+事件循环的设计模式,Dart和Flutter中要同时执行多个任务可以使用异步 来实现,Flutter中主要使用Future来实现异步操作 。
Future 返回值
Future 是一个泛型,其中T代表的是我们耗时操作返回的具体值,如Future 表示一个未来的字符串, Future表示一个未来的布尔值,如果不需要返回值,可以使用Future。- Future.value():返回一个指定值的Future
- Future.delayed():返回一个延时执行的Future
- Future(() { ... return ... }) 返回异步的function * 最多
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); //异常 } }