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