code_timer_progress.dart 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import 'package:ente_auth/ui/linear_progress_widget.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter/scheduler.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 LinearProgressWidget(
  43. color: _progress > 0.4 ? Colors.green : Colors.orange,
  44. fractionOfStorage: _progress,
  45. );
  46. }
  47. }