Flutter学习之倒计时计时器

1、自定义倒计时计时器控件:

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

final TextStyle _availableStyle = TextStyle(
  fontSize: 16.0,
  color: Colors.pink[300],
);

final TextStyle _unavailableStyle = TextStyle(
  fontSize: 16.0,
  color: Colors.grey[400],
);

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

final TextStyle _availableStyle = TextStyle(
  fontSize: 16.0,
  color: Colors.pink[300],
);

final TextStyle _unavailableStyle = TextStyle(
  fontSize: 16.0,
  color: Colors.grey[400],
);

/*
* 倒计时按钮
*/
class FormCode extends StatefulWidget {
  final int countdown; //倒计时的秒数,默认60秒
  final Function onTapCallback; //用户点击时的回调函数
  final bool available;

  FormCode(
      {this.countdown,
      this.onTapCallback,
      this.available = false}); //是否可以获取验证码,默认为"false"

  @override
  State createState() => _FormCodeState();
}

class _FormCodeState extends State<FormCode> {
  Timer _timer; //倒计时的计时器
  int _seconds; //当前倒计时的秒数
  TextStyle inkWellStyle = _availableStyle; //当前墨水瓶("InkWell")的字体样式
  String _verifyStr = "获取验证码"; 当前墨水瓶("InkWell")的文本
  bool isClickDisable=false;//防止点击过快导致Timer出现无法停止的问题
  @override
  void initState() {
    super.initState();
    _seconds = widget.countdown;
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
  }

  //启动倒计时计时器
  void _startTimer() {
    isClickDisable=true;
    _timer = Timer.periodic(Duration(seconds: 1), (timer) {
      if (_seconds == 0) {
        _seconds = widget.countdown;
        inkWellStyle = _availableStyle;
        _verifyStr = "重新发送";
        setState(() {});
        _cancleTimer();
        return;
      }
      _seconds--;
      _verifyStr = "已发送$_seconds" + "s";
      setState(() {});
    });
  }

  //取消到倒计时的计时器
  void _cancleTimer() {
    isClickDisable=false;
    _timer?.cancel();
  }

  @override
  Widget build(BuildContext context) {
    //墨水瓶组件,响应触摸的矩形区域
    if(isClickDisable==null){
      isClickDisable=false;//防止空指针异常
    }
    return widget.available
        ? InkWell(
            child: Text(
              '$_verifyStr',
              style: inkWellStyle,
            ),
            onTap: (_seconds == widget.countdown)&&!isClickDisable
                ? () {
                     _startTimer();
                     inkWellStyle = _unavailableStyle;
                     _verifyStr = "已发送$_seconds" + "s";
                     setState(() {});
                     widget.onTapCallback();
                  }
                : null,
          )
        : InkWell(
            child: Text(
              "获取验证码",
              style: _unavailableStyle,
            ),
          );
  }
}

3、注意点:
计时器启动时间有1s延迟,点击事件在1s内连续点击多次会出现启动多个计时器问题导致计时器出现无法停止问题,所以需要控制点击事件1s内不能点击多次(或者计时器启动后不能再响应点击事件,等计时器停止后再次恢复点击事件)

来源友情链接:https://blog.csdn.net/hekaiyou/article/details/85613681(存在点击过快计时器无法停止问题)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutter中,可以使用Future来实现倒计时功能。下面是一个使用Future实现倒计时的代码示例: ```dart import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: '倒计时示例', theme: ThemeData( primarySwatch: Colors.blue, ), home: CountDownPage(), ); } } class CountDownPage extends StatefulWidget { @override _CountDownPageState createState() => _CountDownPageState(); } class _CountDownPageState extends State<CountDownPage> { int countDownValue = 10; @override void initState() { super.initState(); startCountDown(); } void startCountDown() { Future.delayed(Duration(seconds: 1), () { setState(() { countDownValue--; }); if (countDownValue > 0) { startCountDown(); } }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('倒计时示例'), ), body: Center( child: Text( '倒计时:$countDownValue', style: TextStyle(fontSize: 24), ), ), ); } } ``` 上述代码展示了如何创建一个名为CountDownPage的StatefulWidget,其中使用Future.delayed来实现倒计时的逻辑。在initState中调用了startCountDown方法来启动倒计时,每减少countDownValue的值,并通过setState来更新页面。当countDownValue为0时,停止倒计时。 在构建页面时,使用了Center和Text组件来展示倒计时的数值。 通过这种方式,我们可以在Flutter中使用Future来实现简单的倒计时功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值