天天看點

Flutter延時任務、Flutter通過Future與Timer實作延時任務

題記

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

Flutter延時任務、Flutter通過Future與Timer實作延時任務

本文是異步程式設計的延時政策篇章,在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();
   }
    ... ... 
 }           

完畢

Flutter延時任務、Flutter通過Future與Timer實作延時任務