refactor: enhance connectivity service with disposal checks

- Added checks in the ConnectivityService to prevent operations on a closed stream controller, ensuring stability and preventing potential errors.
- Updated the timer creation and stream addition logic to only execute if the service is not disposed, improving resource management.
- Enhanced the dispose method to safely close the connectivity controller, maintaining clean resource handling.
This commit is contained in:
cogwheel0
2025-10-05 12:36:56 +05:30
parent 980f6b0910
commit 5d37235851
7 changed files with 18 additions and 6 deletions

View File

@@ -50,6 +50,9 @@ class ConnectivityService {
}
Future<void> _checkConnectivity() async {
// Don't check connectivity if service is disposed
if (_connectivityController.isClosed) return;
final serverReachability = await _probeActiveServer();
if (serverReachability != null) {
if (serverReachability) {
@@ -80,7 +83,10 @@ class ConnectivityService {
void _updateStatus(ConnectivityStatus status) {
if (_lastStatus != status) {
_lastStatus = status;
_connectivityController.add(status);
// Only add to stream if controller is not closed
if (!_connectivityController.isClosed) {
_connectivityController.add(status);
}
}
// Adapt polling interval based on recent failures to reduce battery/CPU
@@ -99,10 +105,13 @@ class ConnectivityService {
if (newInterval != _interval) {
_interval = newInterval;
_connectivityTimer?.cancel();
_connectivityTimer = Timer.periodic(
_interval,
(_) => _checkConnectivity(),
);
// Only create new timer if service is not disposed
if (!_connectivityController.isClosed) {
_connectivityTimer = Timer.periodic(
_interval,
(_) => _checkConnectivity(),
);
}
}
}
@@ -113,7 +122,10 @@ class ConnectivityService {
void dispose() {
_connectivityTimer?.cancel();
_connectivityController.close();
_connectivityTimer = null;
if (!_connectivityController.isClosed) {
_connectivityController.close();
}
}
Future<bool?> _probeActiveServer() async {