Flutter之Dart异步实现

331 阅读2分钟

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;
}