login_code_btn.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. Timer? _timer;
  33. /// 当前倒计时的秒数。
  34. 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. if (_seconds != null) {
  61. _seconds = _seconds! - 1;
  62. }
  63. _verifyStr = '$_seconds' 's后重新获取';
  64. setState(() {});
  65. if (_seconds == 0) {
  66. _verifyStr = '重新发送';
  67. }
  68. });
  69. }
  70. /// 取消倒计时的计时器。
  71. void _cancelTimer() {
  72. // 计时器(`Timer`)组件的取消(`cancel`)方法,取消计时器。
  73. _timer?.cancel();
  74. }
  75. @override
  76. Widget build(BuildContext context) {
  77. // 墨水瓶(`InkWell`)组件,响应触摸的矩形区域。
  78. return widget.available
  79. ? InkWell(
  80. onTap: (_seconds == widget.countdown)
  81. ? () {
  82. _startTimer();
  83. inkWellStyle = _unavailableStyle;
  84. _verifyStr = '$_seconds' 's后重新获取';
  85. setState(() {});
  86. widget.onTapCallback();
  87. }
  88. : null,
  89. child: Text(
  90. ' $_verifyStr ',
  91. style: inkWellStyle,
  92. ),
  93. )
  94. : InkWell(
  95. child: Text(
  96. ' 获取验证码 ',
  97. style: _unavailableStyle,
  98. ),
  99. );
  100. }
  101. }