Flutter定時器

import 'dart:async';
import 'package:flutter/material.dart';

/// 墨水瓶(`InkWell`)可用時使用的字體樣式。
final TextStyle _availableStyle = TextStyle(
  fontSize: 16.0,
  color: const Color(0xFF00CACE),
);

/// 墨水瓶(`InkWell`)不可用時使用的樣式。
final TextStyle _unavailableStyle = TextStyle(
  fontSize: 16.0,
  color: const Color(0xFFCCCCCC),
);

class TimerSMSWidget extends StatefulWidget {
  /// 倒計(jì)時的秒數(shù),默認(rèn)60秒。
  final int countdown;

  /// 用戶點(diǎn)擊時的回調(diào)函數(shù)。
  final Function onTapCallback;

  /// 是否可以獲取驗(yàn)證碼,默認(rèn)為`false`。
  final bool available;

  TimerSMSWidget({
    this.countdown: 60,
    this.onTapCallback,
    this.available: false,
  });

  @override
  _TimerSMSWidgetState createState() => _TimerSMSWidgetState();
}

class _TimerSMSWidgetState extends State<TimerSMSWidget> {
  /// 倒計(jì)時的計(jì)時器。
  Timer _timer;

  /// 當(dāng)前倒計(jì)時的秒數(shù)。
  int _seconds;

  /// 當(dāng)前墨水瓶(`InkWell`)的字體樣式。
  TextStyle inkWellStyle = _availableStyle;

  /// 當(dāng)前墨水瓶(`InkWell`)的文本。
  String _verifyStr = '獲取驗(yàn)證碼';

  @override
  void initState() {
    super.initState();
    _seconds = widget.countdown;
  }

  /// 啟動倒計(jì)時的計(jì)時器。
  void _startTimer() {
    // 計(jì)時器(`Timer`)組件的定期(`periodic`)構(gòu)造函數(shù),創(chuàng)建一個新的重復(fù)計(jì)時器。
    _timer = Timer.periodic(Duration(seconds: 1), (timer) {
      if (_seconds == 0) {
        _cancelTimer();
        _seconds = widget.countdown;
        inkWellStyle = _availableStyle;
        setState(() {});
        return;
      }
      _seconds--;
      _verifyStr = '已發(fā)送$_seconds' + 's';
      setState(() {});
      if (_seconds == 0) {
        _verifyStr = '重新發(fā)送';
      }
    });
  }

  /// 取消倒計(jì)時的計(jì)時器。
  void _cancelTimer() {
// 計(jì)時器(`Timer`)組件的取消(`cancel`)方法,取消計(jì)時器。
    _timer?.cancel();
  }

  @override
  Widget build(BuildContext context) {
// 墨水瓶(`InkWell`)組件,響應(yīng)觸摸的矩形區(qū)域。
    return widget.available
        ? InkWell(
            child: Text(
              '  $_verifyStr  ',
              style: inkWellStyle,
            ),
            onTap: (_seconds == widget.countdown)
                ? () {
                    _startTimer();
                    inkWellStyle = _unavailableStyle;
                    _verifyStr = '已發(fā)送$_seconds' + 's';
                    setState(() {});
                    widget.onTapCallback();
                  }
                : null,
          )
        : InkWell(
            child: Text(
              '  獲取驗(yàn)證碼  ',
              style: _unavailableStyle,
            ),
          );
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容