Dart 异步执行

279 阅读1分钟

Dart中的异步操作主要使用Future以及async、await,Flutter 中主要依赖 FutureBuild 和 StreamBuild 实现。

FutureBuild
FutureBuilder(

    future: loadData(),
    //有初始值后会直接执行hasData
    //initialData: "这是一段点位文字",

    builder: ((context, snapshot) {
    
      //异步任务完成后 hasData 或 hasError 必居其一,否则就是还没完成
      if (snapshot.hasData) {
         
          return Text("Data:${snapshot.data}");
          
      } else if (snapshot.hasError) {
          
          return Text("Error:${snapshot.error}");

      } else {

          return CircularProgressIndicator();
      }
  }),

),

async 与 await 同时出现

Future<String> loadData() async {

    String a = await Future.delayed(Duration(seconds: 3), () {
       return "aa";
    });

    String b = await Future.delayed(Duration(seconds: 3), () {
       return "bb";
    });
    
   return a + b;
}
创建Future

Future 创建方法

  • Future()
  • Future.microtask()
  • Future.sync() //同步执行
  • Future.value()
  • Future.delayed()
  • Future.error()
//异步执行
Future future =  Future(Task);
void Task() {
  print("task1 执行");
}

Future 也有同步方法

//第一步,卡住线程首先执行
Future.sync(() {     
    print("sync task");
});

//第三步,异步执行
Future(() {
    print("async task");
});

//第二步执行
print("main stop");

异步执行的回调可以通then回调

Future future = Future(() {
    return "mid";
});

future.then((value) {

    print(value);
});

延迟执行

void yb(){

    print("a");
    
     //延迟执行
     Future.delayed(Duration(seconds: 3), () {
        print("b");
    });
    
    print("c");

}

注意

  • await 可以将异步代码按同步方式支写,表示当前Future 中的代码执行完后才能继续执行后续代码。

  • await 要求该方法必须是异步方法,也就是方法后的()后面有async

  • awit 对应的方法返回值必须是Future

//依次执行共5秒

Future<void> yb() async {
    
    var result = await Future.delayed(Duration(seconds: 3), () {
        return "chibaole";
    });
    
    var result1 = await Future.delayed(Duration(seconds: 2), () {

        return "chibaole";

    });
    print(result + result1);
}

  

//不分顺序,最后一个执行完后进入then

Future<void> yb2() async {

  Future.wait([

        Future.delayed(Duration(seconds: 3), () {
            return "baole";
        }),

        Future.delayed(Duration(seconds: 1), () {
            return "chi";
        }),

    ]).then((List lists) {

        lists.forEach((element) {
            print(element);
        });

 });

}