Flutter的四种异步方式

Flutter的四种异步方式


前言

        对于任务一种开发语言来说,只要涉及到IO等耗时操作,基本上都会涉及到异步操作,比如java的asyncThread,Android 的 Handler+Thread,JavaScript 的Promise 等等。


一、Flutter有哪些异步操作方式?

        主要有 Future.delay, Future.wait,async/await,Stream这四种方式

二、使用步骤

1. Future.delay

          Future.delay表示一般延时多长时间执行任务,主要适用于单个任务的延时操作

  void request() {

    Future.delayed(Duration(seconds: 3),(){
      // 网络请求
      return DioUtil().request(url, data: map);
    }).then((data){
      //处理返回的接口数据
    }).onError((error, stackTrace){
      //请求失败的逻辑
    }).whenComplete((){
      //无论成功或失败都会走到这里
    });

  }

2. Future.wait

        Future.wait主要使用在多个异步任务全部结束之后才能进行下一步的操作,比如说有两个接口请求网络,必须这两个接口都成功执行才能执行then的成功的回调,只要有一个任务执行失败,就会执行错误回调,例如

 void request2() {
    Future.wait([
      Future.delayed(Duration(seconds: 3), () {
        // 获取用户信息
        return DioUtil().request(url, data: map);
      }).then((data) {
        //处理返回的接口数据
      }).onError((error, stackTrace) {
        //请求失败的逻辑
      }),

      Future.delayed(Duration(seconds: 3), () {
        // 获取用户任务数量信息
        return DioUtil().request(url, data: map);
      }).then((data) {
        //处理返回的接口数据
      }).onError((error, stackTrace) {
        //请求失败的逻辑
      })

    ]).then((value){
      // value[0]  就是返回用户信息的数据
      // value[1]  就是返回任务数量信息的数据
    }).catchError((e) {
      print(e);
    });
  }

        上面的任务Future数组和结果value 数组 是位置一一对应的,不论谁的耗时更长都不影响他们在数组的顺序。

3. async/await

               类似于JavaScript 的async/await 的功能,async 用来表示函数是异步的,await 表示等待该异步任务完成,使用这种方式让异步流用同步代码的方式表示出来了,一般的网络请求可以采用这种这种方式,这种方式也是我用的最多的方式

  void request2() async {
    var result = await DioUtil().request(url, data: map);
    // 处理相应的逻辑
  }

4. Stream

                Stream 与Future 不同吗,他可以接收多个异步操作的结果(成功或者失败),比如下面有两次下载文件请求和一次报错,相应的listen(data) 回调用两次,onError会调用一次,经常用于网络下载,文件读写等。

 void request3() {
    Stream.fromFutures([
      // 下载文件1
      Future.delayed(Duration(seconds: 1), () {
        return DioUtil().download(url1, data: map);
      }),
      // 报错
      Future.delayed(Duration(seconds: 2), () {
        throw AssertionError("Error");
      }),
      // 下载文件2
      Future.delayed(Duration(seconds: 3), () {
        return DioUtil().download(url2, data: map);
      })
    ]).listen((data) {
      // 处理对应的逻辑
      print(data);
    }, onError: (e) {
      // 处理对应的报错逻辑
      print(e.toString());
    }, onDone: () {
      print("onDone");
    });
  }


  


总结

            这几种异步方式都各有优缺点,具体使用方式要结合你的使用场景,因地制宜,选择最适合的方式。


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值