在其他语言,比如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
作用:
  1.  async:在方法体前面是使用,定义该方法为一个异步方法。
  2.  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); //异常
    }
  }

 

posted on 2024-01-17 09:40  鲤斌  阅读(69)  评论(0)    收藏  举报