美文网首页
Flutter之Dart异步实现

Flutter之Dart异步实现

作者: xulj100 | 来源:发表于2020-04-14 10:16 被阅读0次

    1、Dart是单线程模型

    Dart是单线程的,那么如何实现耗时操作呢?
    Dart是基于单线程加事件循环来完成耗时操作的处理。

    2、Dart事件循环

    事件循环是什么呢?

    • 事实上事件循环并不复杂,它就是将需要处理的一系列事件(包括点击事件、IO事件、网络事件)放在一个事件队列(Event Queue)中。
    • 不断的从事件队列(Event Queue)中取出事件,并执行其对应需要执行的代码块,直到事件队列清空。 image.png

    3、Dart的异步操作

    • 使用Future实现异步
    import 'dart:io';
    main(List<String> args) {
    
      print("----- start ------");
    
      //getData();
    
      getNetData().then((value){
        print(value);
      });
    
      print("----- end   ------");
    }
    
    //耗时操作,等待3秒
    String getData(){
      sleep(Duration(seconds: 3));
      return "----- 返回数据 ----";
    }
    
    //异步操作
    Future<String> getNetData() {
      return Future<String>(() {
        sleep(Duration(seconds: 3));
        return "----- 异步返回数据 ----";
      });
    }
    

    查看控制台输出,返回数据方法并没有被等待,而是最后返回。

    ----- start ------
    ----- end   ------
    ----- 异步返回数据 ----
    

    Future的其他用法:

    import 'dart:io';
    
    main(List<String> args) {
      print("----- start ------");
    
      //getData();
    
      getNetData().then((value) {
        print(value);
      });
    
      //链式调用
      getNetData().then((value1) {
        print(value1);
        return "----- second data ------";
      }).then((value2) {
        print(value2);
        return "----- third data ------";
      }).then((value3) {
        print(value3);
      });
    
    
      Future.value("----- hello future").then((value){
        print(value);
      });
    
      getErrorData().then((value) {
        print(value);
      }).catchError((error) {
        print(error);
      });
    
    
      getNetworkData().then((value){
        print(value);
      });
    
      print("----- end   ------");
    }
    
    //耗时操作,等待3秒
    String getData() {
      sleep(Duration(seconds: 3));
      return "----- 返回数据 ----";
    }
    
    //异步操作
    Future<String> getNetData() {
      return Future<String>(() {
        sleep(Duration(seconds: 3));
        return "----- 异步返回数据 ----";
      });
    }
    
    //抛出异常
    Future<String> getErrorData() {
      return Future<String>(() {
        sleep(Duration(seconds: 3));
        throw Exception("网络请求出现错误");
      });
    }
    
    //使用 await+async 实现异步,返回的是Future类型
    Future<String> getNetworkData() async {
      var result = await Future.delayed(Duration(seconds: 3), () {
        return "network data";
      });
    
      return "----- " + result;
    }
    

    控制台输出:

    ----- start ------
    ----- end   ------
    ----- hello future
    ----- 异步返回数据 ----
    ----- 异步返回数据 ----
    ----- second data ------
    ----- third data ------
    Exception: 网络请求出现错误
    ----- network data
    
    • 使用await、async实现异步
    //使用 await+async 实现异步,返回的是Future类型
    Future<String> getNetworkData() async {
      var result = await Future.delayed(Duration(seconds: 3), () {
        return "network data";
      });
      return "----- " + result;
    }
    

    相关文章

      网友评论

          本文标题:Flutter之Dart异步实现

          本文链接:https://www.haomeiwen.com/subject/bjnamhtx.html