flutter 获取验证码倒计时组件封装

send_sms_btn.dart

Dart 复制代码
import 'dart:async';

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

// 发送验证码 按钮
class SendSmsBtn extends StatefulWidget {
  final Future<bool> Function()? onTap;
  const SendSmsBtn({
    super.key,
    this.onTap,
  });

  @override
  State<SendSmsBtn> createState() => _SendSmsBtnState();
}

class _SendSmsBtnState extends State<SendSmsBtn> {
  int countdown = 60;
  Timer? timer;

  void sendRegisterMsgCode() {
    if (countdown == 60) {
      countdown--;
      setState(() {});
      timer?.cancel();
      timer = null;
      timer ??= Timer.periodic(const Duration(seconds: 1), (timer) {
        countdown--;
        if (countdown == 0) {
          timer.cancel();
          countdown = 60;
        }
        setState(() {});
      });
    }
  }

  @override
  void dispose() {
    timer?.cancel();
    timer = null;
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return countdown == 60
        ? InkWell(
            onTap: () async {
              //  AppToast.showLoading();
              final s = await widget.onTap?.call() ?? false;
              // AppToast.closeAllLoading();
              if (s) {
                sendRegisterMsgCode();
              }
            },
            child: Container(
              width: 123,
              height: 43,
              alignment: Alignment.centerRight,
              child: Text(
                "发送验证码",
                style: TextStyle(color: Get.theme.primaryColor, fontSize: 14),
              ),
            ),
          )
        : Container(
            width: 123,
            height: 43,
            alignment: Alignment.centerRight,
            child: Text(
              "$countdown s重新获取",
              style: TextStyle(color: Get.theme.primaryColor, fontSize: 14),
            ),
          );
  }
}
相关推荐
BBB努力学习程序设计1 小时前
Bootstrap图片:让图片展示更优雅、更专业
前端·html
玉宇夕落1 小时前
深入理解 async/await:从原理到实战,彻底掌握 JavaScript 异步编程
前端
3秒一个大1 小时前
从代码示例看 ES8 中的 async/await:简化异步操作的利器
javascript
努力往上爬de蜗牛1 小时前
react native token失效 刷新机制
javascript·react native·react.js
Sailing1 小时前
🚀 Promise.then 与 async/await 到底差在哪?(这次彻底讲明白)
前端·javascript·面试
鹤鸣的日常1 小时前
Vue + element plus 二次封装表格
前端·javascript·vue.js·elementui·typescript
JarvanMo1 小时前
Flakeproof - 自动化 Flutter 的用户体验 (UX) 测试
前端
北慕阳1 小时前
速成Vue,自己看
前端·javascript·vue.js
shanyanwt1 小时前
1分钟解决iOS App Store上架图片尺寸问题
前端·ios
摇滚侠1 小时前
HTML5,CSS3,开启浮动布局后,主轴和侧轴的概念
前端·css3·html5