Flutter-了解Future及其用法

一、前言

最近在做Flutter网络这块,涉及到耗时操作,显然要用异步编程。在其他语言,比如java、c++等,会使用多线程来实现。而在Dart语言中,它是单线程+事件循环的设计模式,其中主要使用Future来实现异步操作,为了快速的了解Flutter的异步编程,需要熟练Futter的概念以及用法。

二、Future是什么

同步编程中,立即返回执行的结果或者抛出异常;而异步编程中,返回的是将要完成的结果未来。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......

2.1、Future如何取值

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

2.2、Future处理异常

异常处理使我们在开发中特别需要注意的,正确的处理程序运行中的异常,能给用户带来更好的体验。

在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来进行捕获和处理。

三、使用async和await关键字来处理future

作用:

  1. async:在方法体前面是使用,定义该方法为一个异步方法。
  2. await:等待并获得异步表达式的执行结果,并且给关键字只能在async修饰的方法中。

使用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';
  });
}

3.1、处理async方法中的异常

对于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进行处理。

小结

  1. Future是什么:将要完成的结果未来。
  2. Future如何获取异步的值:通过then()方法
  3. Future如何处理异常:通过catchError()或者在then()中传入命名参数onError
  4. async和wait的关键的作用是什么:async声明一个异步方法,wait等待异步任务完成;简单来讲就是同步的方式编写异步代码。
  5. 如何捕获和处理async中的异常:需要使用try/catch来捕获以及处理程序运行中的异常。

最后,在初次接触Flutter、asnyc和await时,一定要深入了解其中用法以及处理方式,这样才能在后期的开发中得心应手。

你可能感兴趣的:(Flutter,flutter,future,await,asnyc)