美文网首页
Flutter笔记七之异步操作

Flutter笔记七之异步操作

作者: CrazySteven | 来源:发表于2022-05-02 13:39 被阅读0次

    Future

    1.将耗时的操作放到Future函数中
    1.1 只要有返回结果就会执行then()的回调函数
    1.2 如果没有结果返回(报错),需要在Future回调中抛出异常
    2.通过.then()拿到数据并处理
    3.执行whenComplete()结束
    通过下面两个案例来记录
    eg1:

    void main(List<String> args) {
      print("main start");
      var data = getNetWorkData("url");
      print(data);
      data
          .then((value) => print(value))
          .catchError((error) => print(error))
          .whenComplete(() => print("Future代码结束"));
      print("main end!!!");
    }
    
    Future getNetWorkData(String url) {
      return Future((() {
        sleep(Duration(seconds: 5));
        if (true) {
          //正常数据返回
          return "It's OK!";
        } else {
          //报错
          throw Exception("It's an error!");
        }
      }));
    }
    

    eg2:

    void main(List<String> args) {
      print("main start");
      Future(() {
        sleep(Duration(seconds: 5));
        return "第一次请求";
      }).then((value) {
        print(value);
        sleep(Duration(seconds: 4));
        throw Exception("第二次请求报错");
      }).then((value) {
        print(value);
      }).catchError((error) {
        print(error);
      }).whenComplete(() => print("Over!"));
      print("main end!!!");
    }
    

    await

    1. await必须在async函数中才能使用 2.async函数返回的结果必须是一个Future`(系统会自动帮你包裹)
      eg:
    void main(List<String> args) {
      print("main start");
      getData();
      print("main end!!!");
    }
    
    void getData() async {
      var res1 = await getNetWorkData("url");
      print(res1);
      var res2 = await getNetWorkData(res1);
      print(res2);
      var res3 = await getNetWorkData(res2);
      print(res3);
    }
    
    Future getNetWorkData(String url) {
      return Future(() {
        sleep(Duration(seconds: 5));
        return "$url:OK!";
      });
    }
    

    Isolate

    使用

    Isolate.spwan(函数或函数名,参数)有且只有一个参数

    compute

    只能在flutter中使用,dart中不可使用。compute(函数或函数名,参数)有且只有一个参数,并且如果写函数名的话,函数需要是全局函数才行。

    通信
     print("main start");
      //1.创建管道
      ReceivePort receivePort = ReceivePort();
      //2.创建Isolate
      Isolate isolate = await Isolate.spawn((SendPort sendPort) {
        sendPort.send("hello world!");
      }, receivePort.sendPort);
      //3.监听管道
      receivePort.listen((message) {
        print(message);
        //关闭管道
        receivePort.close();
        //结束Isolate
        isolate.kill();
      });
      print("main end");
    }
    

    版权声明:本文为 Crazy Steven 原创出品,欢迎转载,转载时请注明出处!

    相关文章

      网友评论

          本文标题:Flutter笔记七之异步操作

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