syncWhenOnline method
Sync queue when online
Implementation
Future<void> syncWhenOnline() async {
if (!isOnline.value || isSyncing.value) return;
isSyncing.value = true;
try {
while (_queue.isNotEmpty) {
final action = _queue.first;
_actionStatus[action.id] = OfflineActionStatus.executing;
try {
await _executeAction(action);
_queue.removeFirst();
_actionStatus[action.id] = OfflineActionStatus.success;
} catch (e) {
if (e is ConflictException) {
await _handleConflict(action, e);
} else {
// Retry logic
action.retryCount++;
if (action.retryCount >= 3) {
// Move to failed actions
_queue.removeFirst();
_failedActions.add(action);
_actionStatus[action.id] = OfflineActionStatus.failed;
if (kDebugMode) {
debugPrint('Action ${action.type} failed after 3 retries: $e');
}
} else {
// Retry immediately with exponential backoff
if (kDebugMode) {
debugPrint('Action ${action.type} failed, retrying (attempt ${action.retryCount + 1}/3): $e');
}
await Future.delayed(Duration(milliseconds: 100 * action.retryCount));
// Continue loop to retry this action
}
}
}
await _persistQueue();
}
} finally {
isSyncing.value = false;
}
}