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.
|
Before Width: | Height: | Size: 45 MiB After Width: | Height: | Size: 42 MiB |
|
Before Width: | Height: | Size: 705 KiB After Width: | Height: | Size: 2.2 MiB |
|
Before Width: | Height: | Size: 387 KiB After Width: | Height: | Size: 312 KiB |
|
Before Width: | Height: | Size: 293 KiB After Width: | Height: | Size: 318 KiB |
|
Before Width: | Height: | Size: 568 KiB After Width: | Height: | Size: 227 KiB |
|
Before Width: | Height: | Size: 240 KiB After Width: | Height: | Size: 297 KiB |
@@ -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();
|
||||
|
||||