login_code_btn.dart 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import 'dart:async';
  2. import 'package:electronic_assistant/utils/expand.dart';
  3. import 'package:flutter/material.dart';
  4. /// 墨水瓶(`InkWell`)可用时使用的字体样式。
  5. final TextStyle _availableStyle = TextStyle(
  6. fontSize: 14.0,
  7. color: "#6177F2".toColor(),
  8. );
  9. /// 墨水瓶(`InkWell`)不可用时使用的样式。
  10. final TextStyle _unavailableStyle = TextStyle(
  11. fontSize: 14.0,
  12. color: "#AFAFAF".toColor(),
  13. );
  14. class LoginCodeBtn extends StatefulWidget {
  15. /// 倒计时的秒数,默认60秒。
  16. final int countdown;
  17. /// 用户点击时的回调函数。
  18. final Function onTapCallback;
  19. /// 是否可以获取验证码,默认为`false`。
  20. final bool available;
  21. const LoginCodeBtn({
  22. super.key,
  23. this.countdown = 60,
  24. required this.onTapCallback,
  25. this.available = false,
  26. });
  27. @override
  28. _LoginCodeBtnState createState() => _LoginCodeBtnState();
  29. }
  30. class _LoginCodeBtnState extends State<LoginCodeBtn> {
  31. /// 倒计时的计时器。
  32. late Timer timer;
  33. /// 当前倒计时的秒数。
  34. late int _seconds;
  35. /// 当前墨水瓶(`InkWell`)的字体样式。
  36. TextStyle inkWellStyle = _availableStyle;
  37. /// 当前墨水瓶(`InkWell`)的文本。
  38. String _verifyStr = '获取验证码';
  39. @override
  40. void initState() {
  41. super.initState();
  42. _seconds = widget.countdown;
  43. }
  44. @override
  45. void dispose() {
  46. super.dispose();
  47. _cancelTimer();
  48. }
  49. /// 启动倒计时的计时器。
  50. void _startTimer() {
  51. // 计时器(`Timer`)组件的定期(`periodic`)构造函数,创建一个新的重复计时器。
  52. timer = Timer.periodic(const Duration(seconds: 1), (timer) {
  53. if (_seconds == 0) {
  54. _cancelTimer();
  55. _seconds = widget.countdown;
  56. inkWellStyle = _availableStyle;
  57. setState(() {});
  58. return;
  59. }
  60. _seconds--;
  61. _verifyStr = '$_seconds' 's后重新获取';
  62. setState(() {});
  63. if (_seconds == 0) {
  64. _verifyStr = '重新发送';
  65. }
  66. });
  67. }
  68. /// 取消倒计时的计时器。
  69. void _cancelTimer() {
  70. // 计时器(`Timer`)组件的取消(`cancel`)方法,取消计时器。
  71. timer.cancel();
  72. }
  73. @override
  74. Widget build(BuildContext context) {
  75. // 墨水瓶(`InkWell`)组件,响应触摸的矩形区域。
  76. return widget.available
  77. ? InkWell(
  78. onTap: (_seconds == widget.countdown)
  79. ? () {
  80. _startTimer();
  81. inkWellStyle = _unavailableStyle;
  82. _verifyStr = '$_seconds' 's后重新获取';
  83. setState(() {});
  84. widget.onTapCallback();
  85. }
  86. : null,
  87. child: Text(
  88. ' $_verifyStr ',
  89. style: inkWellStyle,
  90. ),
  91. )
  92. : InkWell(
  93. child: Text(
  94. ' 获取验证码 ',
  95. style: _unavailableStyle,
  96. ),
  97. );
  98. }
  99. }