先看代碼
push到一個(gè)新的頁面,然后手動(dòng)pop返回一個(gè)字符串
push_future() async{
print("1111");
var result = await Navigator.push(context, MaterialPageRoute(builder: (context){
return NextPage();
}));
print("result:${result}");
print("2222");
}
調(diào)用方法
var fun = push_future();
print("fun:${fun}");
打印如下:
第三行開始是在二級頁面pop之后才打印的
flutter: 1111
flutter: fun:Instance of 'Future<dynamic>'
flutter: result:next pop
flutter: 2222
得出:
- 用來表示函數(shù)是異步的,定義的函數(shù)會(huì)返回一個(gè)Future對象,可以使用then方法添加回調(diào)函數(shù)
- 后面是一個(gè)Future,表示等待該異步任務(wù)完成,異步完成后才會(huì)往下走;await必須出現(xiàn)在 async 函數(shù)內(nèi)部
可以看到,我們通過async/await將一個(gè)異步流用同步的代碼表示出來了
其實(shí),無論是在JavaScript還是Dart中,async/await都只是一個(gè)語法糖,編譯器或解釋器最終都會(huì)將其轉(zhuǎn)化為一個(gè)Promise(Future)的調(diào)用鏈。
如果是獲取網(wǎng)絡(luò)數(shù)據(jù),就不能如上了,因?yàn)榉祷氐氖荈uture對象
定義一個(gè)全局變量netData 接受比較好
get_net_right_data() async {
print("1111_right");
netData = await Future.delayed(Duration(seconds: 2),(){
return '網(wǎng)絡(luò)數(shù)據(jù)獲取到了';
});
print("netData:${netData}");
return netData;
}