Dart4Flutter -拾遺01 - flutter-dart環境搭建
引入第三方庫
引入async庫,獲取非同步的支援
import 'dart:async';
main(List<String> args) {
}
複製程式碼
Future
async 庫中有一個叫Future的東西。Future是基於觀察者模式的。如果你熟悉Rx或者JavaScript的Promises,你就明白了。
簡單說,一個Future定義一個未來要發生的事,例如,將來一個值返回給我們。來讓我們看看Future實際怎麼用。
Future是支援泛型的,例如Future,通過T指定將來返回值的型別。
import 'dart:async';
main(List<String> args) {
getAJoke().then((value) {
print(value);
})
.catchError((error) {
print('Error');
});
}
Future<String> getAJoke() {
return new Future<String>(() {
//Do a long running task. E.g. Network Call.
//Return the result
return "This is a joke";
});
}
複製程式碼
我們定義了一個叫getAJoke
的函式,返回值為Future<String>
.你可以通過new
關鍵字建立一個Future。Future的建構函式,需要一個函式作為引數,這個函式返回T
型別的資料。在匿名函式中的返回值就是Future的返回值。
在main函式中,我們呼叫了getAJoke
方法,他返回Future<String>
.我們通過呼叫then
方法訂閱Future,在then
中註冊回撥函式,當Future返回值時呼叫註冊函式。同時註冊了catchError
方法處理在Future執行之間發生的異常。在上面的例子中不會發生異常。
下面的例子是會發生異常的例子。
import 'dart:async';
main(List<String> args) {
getAJoke().then((value) {
print(value);
})
.catchError((error) {
print('Error');
});
}
Future<String> getAJoke() {
return new Future<String>(() {
//Do a long running task. E.g. Network Call.
//Return the result
throw new Exception('No joke for you!');
return "This is a joke";
});
}
複製程式碼
現在我們的例子都是會立即返回的,但是在生產環境中都是一些耗時的操作,例如,網路呼叫,我們可以使用Future.delayed()
模仿
import 'dart:async';
main(List<String> args) {
getAJoke().then((value) {
print(value);
})
.catchError((error) {
print('Error');
});
}
Future<String> getAJoke() {
return new Future<String>.delayed(new Duration(milliseconds: 2000),() {
//Do a long running task. E.g. Network Call.
//Return the result
return "This is a joke";
});
}
複製程式碼
現在如果你執行,你將需要2秒,才能返回結果。現在看另一個例子。
import 'dart:async';
main(List<String> args) {
getAJoke().then((value) {
print(value);
})
.catchError((error) {
print('Error');
});
print('Another print statement.');
}
Future<String> getAJoke() {
return new Future<String>.delayed(new Duration(milliseconds: 2000),() {
//Do a long running task. E.g. Network Call.
//Return the result
return "This is a joke";
});
}
複製程式碼
如上所示,在呼叫函式之後,我們新增了print語句。在這種場景中,print語句會先執行,之後future的返回值才會列印。這是future的預期行為.但是如果我們希望在執行其他語句之前,先執行future。所以我們需要用到async/await
.
Async/Await
import 'dart:async';
main(List<String> args) async {
try {
String result = await getAJoke();
print(result);
} catch(e) {
print(e);
}
print('Another print statement.');
}
Future<String> getAJoke() {
return new Future<String>.delayed(new Duration(milliseconds: 2000),() {
//Do a long running task. E.g. Network Call.
//Return the result
return "This is a joke";
});
}
複製程式碼
如上所示,我們在main函式的花括號開始新增async
關鍵字。我們新增await
關鍵字在呼叫getAJoke
方法之前,他所做的就是在future返回值之後,繼續往下執行。我們將整個程式碼包裹在try-catch中,我們想捕獲所有的異常,和之前使用catchError回撥是一樣。使用awiat
關鍵字,必須給函式新增async
關鍵字,否則沒有效果。
結束
參考