Fix progress bar when local time is incorrect

This commit is contained in:
Neeraj Gupta
2025-05-31 16:23:06 +05:30
parent b560e5b71a
commit 5d0a86c248
2 changed files with 15 additions and 10 deletions

View File

@@ -7,10 +7,12 @@ import 'package:flutter/material.dart';
class CodeTimerProgress extends StatefulWidget {
final int period;
final bool isCompactMode;
final int timeOffsetInMilliseconds;
const CodeTimerProgress({
super.key,
required this.period,
this.isCompactMode = false,
this.timeOffsetInMilliseconds = 0,
});
@override
@@ -20,7 +22,7 @@ class CodeTimerProgress extends StatefulWidget {
class _CodeTimerProgressState extends State<CodeTimerProgress> {
late final Timer _timer;
late final ValueNotifier<double> _progress;
late final int _periodInMicros;
late final int _periodInMilii;
// Reduce update frequency
final int _updateIntervalMs =
@@ -29,29 +31,30 @@ class _CodeTimerProgressState extends State<CodeTimerProgress> {
@override
void initState() {
super.initState();
_periodInMicros = widget.period * 1000000;
_periodInMilii = widget.period * 1000;
_progress = ValueNotifier<double>(0.0);
_updateTimeRemaining(DateTime.now().microsecondsSinceEpoch);
_updateTimeRemaining(DateTime.now().millisecondsSinceEpoch);
_timer = Timer.periodic(Duration(milliseconds: _updateIntervalMs), (timer) {
final now = DateTime.now().microsecondsSinceEpoch;
final now = DateTime.now().millisecondsSinceEpoch;
_updateTimeRemaining(now);
});
}
void _updateTimeRemaining(int currentMicros) {
void _updateTimeRemaining(int currentMilliSeconds) {
// More efficient time calculation using modulo
final elapsed = (currentMicros) % _periodInMicros;
final timeRemaining = _periodInMicros - elapsed;
_progress.value = timeRemaining / _periodInMicros;
final elapsed = (currentMilliSeconds + widget.timeOffsetInMilliseconds) %
_periodInMilii;
final timeRemaining = _periodInMilii - elapsed;
_progress.value = timeRemaining / _periodInMilii;
}
@override
void didUpdateWidget(covariant CodeTimerProgress oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.period != widget.period) {
_periodInMicros = widget.period * 1000000;
_updateTimeRemaining(DateTime.now().microsecondsSinceEpoch);
_periodInMilii = widget.period * 1000;
_updateTimeRemaining(DateTime.now().millisecondsSinceEpoch);
}
}

View File

@@ -152,6 +152,8 @@ class _CodeWidgetState extends State<CodeWidget> {
key: ValueKey('period_${widget.code.period}'),
period: widget.code.period,
isCompactMode: widget.isCompactMode,
timeOffsetInMilliseconds:
PreferenceService.instance.timeOffsetInMilliSeconds(),
),
widget.isCompactMode
? const SizedBox(height: 4)