code_timer_progress.dart 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter/scheduler.dart';
  3. import 'package:flutter_animation_progress_bar/flutter_animation_progress_bar.dart';
  4. class CodeTimerProgress extends StatefulWidget {
  5. final int period;
  6. CodeTimerProgress({
  7. Key? key,
  8. required this.period,
  9. }) : super(key: key);
  10. @override
  11. _CodeTimerProgressState createState() => _CodeTimerProgressState();
  12. }
  13. class _CodeTimerProgressState extends State<CodeTimerProgress>
  14. with SingleTickerProviderStateMixin {
  15. late final Ticker _ticker;
  16. double _progress = 0.0;
  17. late final int _microSecondsInPeriod;
  18. @override
  19. void initState() {
  20. super.initState();
  21. _microSecondsInPeriod = widget.period * 1000000;
  22. _ticker = createTicker((elapsed) {
  23. _updateTimeRemaining();
  24. });
  25. _ticker.start();
  26. _updateTimeRemaining();
  27. }
  28. void _updateTimeRemaining() {
  29. int timeRemaining = (_microSecondsInPeriod) -
  30. (DateTime.now().microsecondsSinceEpoch % _microSecondsInPeriod);
  31. setState(() {
  32. _progress = (timeRemaining / _microSecondsInPeriod);
  33. });
  34. }
  35. @override
  36. void dispose() {
  37. _ticker.dispose();
  38. super.dispose();
  39. }
  40. @override
  41. Widget build(BuildContext context) {
  42. return FAProgressBar(
  43. currentValue: _progress * 100,
  44. size: 4,
  45. animatedDuration: const Duration(milliseconds: 10),
  46. progressColor: Colors.orange,
  47. changeColorValue: 40,
  48. changeProgressColor: Colors.green,
  49. );
  50. }
  51. }