Flutter 三点二:Dart 异步 async 和 await

async 和 await

  • Future 链式调用 更清晰
  • 异步操作依赖关系比较复杂 可使用async await
  • async await 调用逻辑更清晰
  • async await 异常处理 try{}catch(){} 即可
  • async 修饰的方法 总是返回Future对象 不会阻塞主线程
  • await 关键字只有在async修饰的方法内才有效
  • 都是把事件交给 EventLoop
登录流程Future写法
复制代码
void main() {
    Future.value(["username","password"])
        .then((value){
        login(value[0],value[1]);
        print("${DateTime.now().millisecondsSinceEpoch} >> 登录中...");
        sleep(Duration(seconds: 5));
        return '{"id": 10001,"name": "John","classGrade": "三年二班","birthday": "2005-12-12 12:12:12", "age": 30}';})
        .then((value){
        return value;
    })
        .then((value){
        print("${DateTime.now().millisecondsSinceEpoch} >> "+value);  //json
        var json = jsonDecode(value);
        int id = json['id'];
        getUserInfo(id);
        print("${DateTime.now().millisecondsSinceEpoch} >> 获取用户信息...");
        sleep(Duration(seconds: 5));
        return "成功,缓存数据,跳转首页";
    })
        .catchError((value){})
        .whenComplete((){
        print("登录流程结束!");
    });
}

login(String username,String password){
    print("${DateTime.now().millisecondsSinceEpoch} >> ${username}请求登录!");
}
getUserInfo(int id){
    print("${DateTime.now().millisecondsSinceEpoch} >> ${id}获取用户信息!");
}

运行结果

复制代码
1703727827384 >> username请求登录!
1703727827384 >> 登录中...
1703727832400 >> {"id": 10001,"name": "John","classGrade": "三年二班","birthday": "2005-12-12 12:12:12", "age": 30}
1703727832418 >> 10001获取用户信息!
1703727832418 >> 获取用户信息...
登录流程结束!
async/await 写法
复制代码
import 'dart:convert';
import 'dart:io';

void main() async{
    var loginResult = await login("aaa", "123");
    var userInfo = await getUserInfo(loginResult);
    print(userInfo);
}

Future<String> login(String username,String password){
    print("${DateTime.now().millisecondsSinceEpoch} >> ${username}请求登录!");
    return  Future.value([username,password])
        .then((value){
        print("${DateTime.now().millisecondsSinceEpoch} >> 登录中...");
        sleep(Duration(seconds: 5));
        return '{"id": 10001,"name": "John","classGrade": "三年二班","birthday": "2005-12-12 12:12:12", "age": 30}';})
        .then((value){
        return value;
    });
}
Future<String> getUserInfo(String value){
    return Future((){
        print("${DateTime.now().millisecondsSinceEpoch} >> "+value);  //json
        var json = jsonDecode(value);
        print("${DateTime.now().millisecondsSinceEpoch} >> 获取用户信息...");
        sleep(Duration(seconds: 5));
        return "成功,缓存数据,跳转首页";
    });
}

请求结果

复制代码
1703727905612 >> aaa请求登录!
1703727905617 >> 登录中...   //5s等待返回结果
1703727910642 >> {"id": 10001,"name": "John","classGrade": "三年二班","birthday": "2005-12-12 12:12:12", "age": 30}
1703727910660 >> 获取用户信息...    //5s等待
1703727915670 >> 成功,缓存数据,跳转首页   
async 修饰的方法 总是返回Future对象 不会阻塞主线程
复制代码
import 'dart:convert';
import 'dart:io';

void main(){
   var login = startLogin();
   print("login.runtimeType>>${login.runtimeType}");
}

startLogin() async{
    var loginResult = await login("aaa", "123");
    var userInfo = await getUserInfo(loginResult);
    print("${DateTime.now().millisecondsSinceEpoch} >> "+userInfo);
}

Future<String> login(String username,String password){
    return  Future.value([username,password])
        .then((value){
        print("${DateTime.now().millisecondsSinceEpoch} >> 登录中...");
        sleep(Duration(seconds: 5));
        return '{"id": 10001,"name": "John","classGrade": "三年二班","birthday": "2005-12-12 12:12:12", "age": 30}';})
        .then((value){
        return value;
    });
}
Future<String> getUserInfo(String value){
    return Future((){
        print("${DateTime.now().millisecondsSinceEpoch} >> "+value);  //json
        var json = jsonDecode(value);
        print("${DateTime.now().millisecondsSinceEpoch} >> 获取用户信息...");
        sleep(Duration(seconds: 5));
        return "成功,缓存数据,跳转首页";
    });
}

结果:

复制代码
login.runtimeType>>Future<dynamic>  //类型是Future
await 关键字只有在async修饰的方法内才有效
相关推荐
|_⊙2 小时前
网络层协议 IP
服务器·网络·tcp/ip
无言听风雨丶2 小时前
Kubernetes Service Mesh 与 mTLS 实战:从网络可达走向零信任服务通信
网络·kubernetes·service_mesh
叼烟扛炮2 小时前
Linux 学习笔记(六十):单线程的逆袭——epoll 高并发服务器实战
linux·服务器·网络·笔记·学习·算法
传奇开心果3 小时前
【Flutter踩坑排雷】第5课:扩展方法冲突坑|同名扩展引发编译歧义,故障规避手段
android·flutter
沫璃染墨4 小时前
从零入门计算机网络系列(十五):TCP可靠传输机制详解——从序号与确认应答到乱序处理
服务器·网络·c++·tcp/ip·tcp
xiaoye-duck5 小时前
《C++ 项目:手写大模型接入 SDK》本地 Ollama 部署与适配
开发语言·网络·c++·语言模型
叼烟扛炮6 小时前
Linux 学习笔记(六十一):网络编程毕业设计——Reactor 反应堆模式
linux·网络·笔记·学习·课程设计
2401_868534786 小时前
【网络安全
网络·python
xyzzklk6 小时前
变相解决华为Mate 8锁屏后无法建立入站网络连接
linux·运维·服务器·网络·华为·go·安卓
叼烟扛炮8 小时前
Linux 学习笔记(五十九):epoll 的生死抉择——LT 与 ET 模式
linux·运维·服务器·网络·笔记·学习·php