Flutter倒數計時/計時器的實現

我與bug不得不說的故事發表於2019-04-10

近期我會發一部分系列的flutter,大家覺得有用可以點點關注。

在我們實現某些功能時,可能會有倒數計時的需求。

比如傳送簡訊驗證碼,傳送成功後可能要求使用者一段時間內不能再次傳送,這時候我們就需要進行倒數計時,時間到了才允許再次操作。
如下圖:

Flutter倒數計時/計時器的實現
image.png

為了實現這樣場景的需求,我們需要使用Timer.periodic

一、引入Timer對應的庫

import 'dart:async';
複製程式碼

二、定義計時變數

class _LoginPageState extends State<LoginPage> {
  ...
  Timer _timer;
  int _countdownTime = 0;
  ...
}
複製程式碼

三、點選後開始倒數計時
這裡我們點選傳送驗證碼文字來舉例說明。

GestureDetector(
  onTap: () {
    if (_countdownTime == 0 && validateMobile()) {
      //Http請求傳送驗證碼
      ...
      setState(() {
        _countdownTime = 60;
      });
      //開始倒數計時
      startCountdownTimer();
    }
  },
  child: Text(
    _countdownTime > 0 ? '$_countdownTime後重新獲取' : '獲取驗證碼',
    style: TextStyle(
      fontSize: 14,
      color: _countdownTime > 0
          ? Color.fromARGB(255, 183, 184, 195)
          : Color.fromARGB(255, 17, 132, 255),
    ),
  ),
)
複製程式碼

四、倒數計時的實現方法

void startCountdownTimer() {
  const oneSec = const Duration(seconds: 1);

  var callback = (timer) => {
    setState(() {
      if (_countdownTime < 1) {
        _timer.cancel();
      } else {
        _countdownTime = _countdownTime - 1;
      }
    })
  };

  _timer = Timer.periodic(oneSec, callback);
}
複製程式碼

五、最後在dispose()取消定時器

@override
void dispose() {
  super.dispose();
  if (_timer != null) {
    _timer.cancel();
  }
}
複製程式碼

這樣我們就實現了傳送驗證碼的倒數計時功能。除此之外,Timer還能做其他的很多事情,有興趣的同學可以檢視Timer的官方文件

Flutter倒數計時/計時器的實現

歡迎大家討論留言,我們共同成長!!!


相關文章