activity_countdown_txt_view.dart 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. class ActivityCountdownTextView extends StatefulWidget {
  4. final Duration duration;
  5. final TextStyle? textStyle;
  6. final BoxDecoration? timeBgBoxDecoration;
  7. final double? timeItemWidth;
  8. final double? timeItemHeight;
  9. final BoxFit bgFit;
  10. final EdgeInsetsGeometry contentPadding;
  11. final Widget? separator;
  12. const ActivityCountdownTextView({
  13. super.key,
  14. required this.duration,
  15. this.timeBgBoxDecoration,
  16. this.textStyle,
  17. this.timeItemWidth,
  18. this.timeItemHeight,
  19. this.bgFit = BoxFit.contain,
  20. this.contentPadding = const EdgeInsets.all(4),
  21. this.separator,
  22. });
  23. @override
  24. State<ActivityCountdownTextView> createState() =>
  25. _ActivityCountdownTxtViewState();
  26. }
  27. class _ActivityCountdownTxtViewState extends State<ActivityCountdownTextView> {
  28. late Duration _remaining;
  29. @override
  30. void didUpdateWidget(covariant ActivityCountdownTextView oldWidget) {
  31. super.didUpdateWidget(oldWidget);
  32. if (oldWidget.duration != widget.duration) {
  33. setState(() {
  34. _remaining = widget.duration;
  35. });
  36. }
  37. }
  38. @override
  39. void initState() {
  40. super.initState();
  41. _remaining = widget.duration;
  42. }
  43. String _twoDigits(int n) => n.toString().padLeft(2, '0');
  44. @override
  45. Widget build(BuildContext context) {
  46. final hours = _twoDigits(_remaining.inHours);
  47. final minutes = _twoDigits(_remaining.inMinutes.remainder(60));
  48. final seconds = _twoDigits(_remaining.inSeconds.remainder(60));
  49. return Row(
  50. mainAxisSize: MainAxisSize.min,
  51. children: [
  52. _buildTimeBox(hours),
  53. _buildSeparator(),
  54. _buildTimeBox(minutes),
  55. _buildSeparator(),
  56. _buildTimeBox(seconds),
  57. ],
  58. );
  59. }
  60. /// 自定义时间数字块,2位合并显示
  61. Widget _buildTimeBox(String text) {
  62. return Container(
  63. width: widget.timeItemWidth,
  64. height: widget.timeItemHeight,
  65. alignment: Alignment.center,
  66. padding: widget.contentPadding,
  67. decoration: widget.timeBgBoxDecoration,
  68. child: Text(
  69. text,
  70. maxLines: 1,
  71. style: widget.textStyle ??
  72. const TextStyle(
  73. fontSize: 20, fontWeight: FontWeight.bold, color: Colors.white),
  74. ),
  75. );
  76. }
  77. /// 自定义分隔符(冒号),如果未设置就给默认间距
  78. Widget _buildSeparator() {
  79. return widget.separator ??
  80. const SizedBox(
  81. width: 4,
  82. );
  83. }
  84. @override
  85. void dispose() {
  86. super.dispose();
  87. }
  88. }