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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 MiB

After

Width:  |  Height:  |  Size: 42 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 705 KiB

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 387 KiB

After

Width:  |  Height:  |  Size: 312 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 293 KiB

After

Width:  |  Height:  |  Size: 318 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 568 KiB

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 240 KiB

After

Width:  |  Height:  |  Size: 297 KiB

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,8 +83,11 @@ class ConnectivityService {
void _updateStatus(ConnectivityStatus status) {
if (_lastStatus != status) {
_lastStatus = 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
if (status == ConnectivityStatus.offline) {
@@ -99,12 +105,15 @@ class ConnectivityService {
if (newInterval != _interval) {
_interval = newInterval;
_connectivityTimer?.cancel();
// Only create new timer if service is not disposed
if (!_connectivityController.isClosed) {
_connectivityTimer = Timer.periodic(
_interval,
(_) => _checkConnectivity(),
);
}
}
}
Future<bool> checkConnectivity() async {
await _checkConnectivity();
@@ -113,8 +122,11 @@ class ConnectivityService {
void dispose() {
_connectivityTimer?.cancel();
_connectivityTimer = null;
if (!_connectivityController.isClosed) {
_connectivityController.close();
}
}
Future<bool?> _probeActiveServer() async {
final baseUri = _resolveBaseUri();