cyberhybridhub/lib/data/sync/connectivity_service.dart
2026-05-20 10:22:58 -05:00

64 lines
1.6 KiB
Dart

import 'dart:async';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/foundation.dart' show kIsWeb;
/// Observes network reachability and exposes online/offline transitions.
class ConnectivityService {
ConnectivityService({Connectivity? connectivity})
: _connectivity = connectivity ?? Connectivity();
final Connectivity _connectivity;
final StreamController<bool> _onlineController =
StreamController<bool>.broadcast();
StreamSubscription<List<ConnectivityResult>>? _subscription;
bool _isOnline = true;
Stream<bool> get onlineChanges => _onlineController.stream;
bool get isOnline => _isOnline;
Future<void> initialize() async {
if (kIsWeb) {
_isOnline = true;
_onlineController.add(true);
return;
}
final List<ConnectivityResult> results = await _connectivity
.checkConnectivity();
_emitOnline(_resultsOnline(results));
_subscription = _connectivity.onConnectivityChanged.listen(
(List<ConnectivityResult> results) => _emitOnline(_resultsOnline(results)),
);
}
void dispose() {
_subscription?.cancel();
_onlineController.close();
}
bool _resultsOnline(List<ConnectivityResult> results) {
if (results.isEmpty) {
return false;
}
return results.any(
(ConnectivityResult r) =>
r == ConnectivityResult.mobile ||
r == ConnectivityResult.wifi ||
r == ConnectivityResult.ethernet ||
r == ConnectivityResult.vpn,
);
}
void _emitOnline(bool online) {
if (_isOnline == online) {
return;
}
_isOnline = online;
_onlineController.add(online);
}
}