前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flutter异步编程async与await的基本使用

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

原创
作者头像
早起的年轻人
修改2020-08-07 15:08:05
1.9K0
修改2020-08-07 15:08:05
举报
文章被收录于专栏:flutter开发中的点滴积累

题记

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


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

代码语言:txt
复制
  //代码清单 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"});
  }

或者可以这样来写:

代码语言:txt
复制
  //代码清单 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中的写法

代码语言:txt
复制
  //代码清单 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()。

代码语言:txt
复制
//代码清单 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中所示

代码语言:txt
复制
///代码清单 1-5
void test() async{
   await getDataA();
   await getDataB();
}

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

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

完毕

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云课堂
云课堂聚焦教培机构 OMO 转型,为机构提供在线及混合式课堂解决方案,极速开课、多向互动、智能沉淀、一键分发,是教培课堂便捷、稳定的教学助手。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档