Flutter异步编程async与await的基本使用

2,204

题记 —— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天。

**你可能需要
CSDN网易云课堂教程
掘金EDU学院教程
知乎Flutter系列文章

异步编程常用于网络请求、缓存数据加载、本地File图片加载、定时与延时任务等,在Flutter开发中 ,使用async开启一个异步开始处理,使用await来等待处理结果,如处理一个网络请求,代码如下:

  //代码清单 1-1
  //HTTP的get请求返回值为Future<String>类型,即其返回值未来是一个String类型的值
  //async关键字声明该函数内部有代码需要延迟执行
  Future<String> getData() async {    
    //await关键字声明运算为延迟执行,然后return运算结果
    return await http.get(Uri.encodeFull(url), headers: {"Accept": "application/json"});
  }

或者可以这样来写:

  //代码清单 1-2 
  Future<String> getData() async {    
    //await关键字声明运算为延迟执行,然后return运算结果
    //异步执行 1-2-1
    String  result = await http.get(Uri.encodeFull(url1), headers: {"Accept": "application/json"});
     //异步执行 1-2-2
    String result2 = await http.get(Uri.encodeFull(url2), headers: {"Accept": "application/json"});
    return 
  }

在代码清单1-2中执行了两个异步任务,这两个异步任务是串行的,也就是异步 1-2-1 执行完毕后,获取到结果 result ,然后再开启异步执行 1-2-2,在实际项目可应用于使用第一个网络请求的结果来动态加载第二个网络请求或者是其他分类别的异步任务,代码清单1-2也可以拆分成如下代码清单1-3中的写法

  //代码清单 1-3
  Future<String> getData() async {    
    //await关键字声明运算为延迟执行,然后return运算结果
    //异步执行 1-2-1
    String  result = await getDataA();
    String result2 = await getDataB();
    return  Future.value(result2);
  }
 Future<String> getDataA() async {    
    //await关键字声明运算为延迟执行,然后return运算结果
    return await http.get(Uri.encodeFull(url1), headers: {"Accept": "application/json"});
  }
    Future<String> getDataB() async {    
    //await关键字声明运算为延迟执行,然后return运算结果
    return await http.get(Uri.encodeFull(url1), headers: {"Accept": "application/json"});
  }

然后对于代码清单1-3中异步处理getDataA()与getDataB()可以分别加入异常捕捉机制(如下代码清单1-4),以确保在异步处理之间不会相互影响,如在在这的异步处理getDataA()与getDataB(),如果getDataA()方法出现了异常,在Flutter中就会直接报错,而不再执行异步处理getDataB()。

//代码清单 1-4
  Future<String> getDataA() async {
    String result = "";
    try {
      return  await http.get(Uri.encodeFull(url1), headers: {"Accept": "application/json"});
    } catch (e) {
      result = "出现异常";
    } finally {
      return Future.value(result);
    }
  }
    Future<String> getDataB() async {    
      String result = "";
	    try {
	      return  await http.get(Uri.encodeFull(url2), headers: {"Accept": "application/json"});
	    } catch (e) {
	      result = "出现异常";
	    } finally {
	      return Future.value(result);
	    }
  }

串行调用 两个异步任务的一般写法如下代码清单1-5中所示

///代码清单 1-5
void test() async{
   await getDataA();
   await getDataB();
}

也可以用另一种方式来写如下代码清单1-6

///代码清单 1-6
  void test() async {
    getDataA().then((value1) {
      ///值value1就是getDataA中返回的结果
      getDataB().then((value2) {
        ///值value2就是getDataB中返回的结果
      });
    });
  }

完毕 公众号 我的大前端生涯