Flutter异步编程async与await的基本使用
时间:2022-07-22
本文章向大家介绍Flutter异步编程async与await的基本使用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题记
—— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天。
异步编程常用于网络请求、缓存数据加载、本地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中返回的结果
});
});
}
完毕
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 抖音小程序基础之 如何使用选择器class id element (教程含源码)
- 3分钟短文:Laravel模型作用域,为你“节省”更多代码
- Pytorch 0.4.0版本保存的模型在高版本调用问题的解决方式
- Qt音视频开发27-Onvif设备搜索
- 容器化 FRP 使用方案
- 学习从拥有一支好笔开始
- leetcode栈之最小栈
- Discourse 安装防火墙的配置如何让邮件能够发送
- CentOS 8 如何安装 htop
- Discourse 重复安装过程中的密钥签发问题
- Appium之「元素定位和UiAutomator表达式」
- 机器人软件开发:机器人开源库安装
- 2020-10-05:如何求模平方根?
- leetcode栈之比较含退格的字符串
- Discourse 如何不使用 Let’s Encrypt 而使用 CA 签名的密钥进行安装