題記
—— 執劍天涯,從你的點滴積累開始,所及之處,必精益求精,即是折騰每一天。

本文是異步程式設計的延時政策篇章,在Flutter中實作延時操作有兩種方式,一種是通過Future,另一種是通過Timer。
1 Future
在Flutter中實作延時 1秒的操作,使用Fluture來實作,代碼如下:
///代碼清單 1-1
///方式一
///參數一 延時的時間
///參數二 延時執行的方法
Future.delayed(Duration(milliseconds: 1000), () {
print("延時1秒執行");
});
///代碼清單 1-2
///方式二
Future.delayed(Duration(milliseconds: 1000)).whenComplete((){
print("延時1秒執行 whenComplete ");
});
///代碼清單 1-3
///方式二
Future.delayed(Duration(milliseconds:1000)).then((value){
print("延時1秒執行 then ");
});
在上述代碼清單 1-1、1-2、1-3中分别展示了使用Future的延時操作的三種方式,這三種方式 是小編實作延時操作的一些思路,一般建議使用代碼清單1-1中所示的第一種,對于代碼清單1-2與1-3中所示的whenComplete與then函數,功能更強大,應當用到合适的位置。
Future的then函數傳回值類型為一個Future對象,是以支援鍊式調用,組合在一起就是串行方式調用,如下代碼塊 1-4 中所示:
///代碼清單 1-4
Future.delayed(Duration(milliseconds: 1000), () {
print("延時1秒執行");
return Future.value("測試資料");
}).then((value) {//函數一
print(" then $value");
return Future.value("測試資料 2");
}).then((value) {///函數二
print(" then $value");
return Future.value("測試資料 2");
}).then((value) {//函數三
///value 就是 函數一中回傳的值
print(" then $value");
});
假如在then函數中任何一個環節出現了異常,那麼後續的函數将會被中斷執行(如清單1-4中的then函數一出現了問題,then函數二與三就都不會執行)相當于是程式線程停止在這裡了,對于手機界面來講就是無響應或者是紅屏顯示。
在代碼清單1-3中所示的whenComplete方法,并傳回一個Future,類似于try-catch-finally中的finally塊,是以用whenComplete來結尾多個異步操作是一個合适的解決方案,如下代碼清單1-5所示
/// 代碼清單 1-5
Future.delayed(Duration(milliseconds: 1000), () {
print("延時1秒執行");
return Future.value("測試資料");
}).then((value) {//函數一
print(" then $value");
return Future.value("測試資料 2");
}).then((value) {///函數二
print(" then $value");
throw 'Error!';
return Future.value("測試資料 3");
}).then((value) {//函數三
///value 就是 函數一中回傳的值
print(" then $value");
}).catchError((err) {
print('Caught $err'); // Handle the error.
},test: (e){
print('Caughte $e'); // Han
return e is String;
}).whenComplete((){
print("程式執行完成");
});
在代碼清單 1-5中也使用到了catchError函數,在這裡,當then這幾個函數中任何一個處理出現 異常,都會回調此方法,如這裡在函數二中通過 throw抛出的一個異常,在catchError函數中捕捉到這個異常,然後回調test方法塊,再回調catchError的參數一的函數處理,類似try-catch-finally中的catch,它的定義如下代碼清單1-6所示:
/// 代碼清單 1-6
Future<T> catchError(Function onError, {bool test(Object error)});
2 Timer
通過Timer來實作延時2秒的操作,如下代碼清單 2-1 所示:
///延時2秒
Timer timer = new Timer(Duration(milliseconds: 2000), (){
});
相比來講 Future中實作的延時操作也是通過Timer來實作的,在實際開發中,如果隻是一個單純的延時操作,小編建議使用Timer,如下代碼清單2-2所示,在目前Widget銷毀時取消延時任務,可避免記憶體洩漏。
class _TimerDelayedTestPageState extends State{
///聲明
Timer timer;
@override
void initState() {
super.initState();
///延時2秒
timer = new Timer(Duration(milliseconds: 2000), (){
});
}
@override
void dispose() {
///取消延時任務
timer.cancel();
super.dispose();
}
... ...
}
完畢