Trigger background sync on connectivity recovery

This commit is contained in:
Rijad Zuzo
2026-02-17 23:52:32 +01:00
parent d76b31d37d
commit 9bb484e95d
13 changed files with 268 additions and 3 deletions
@@ -6,6 +6,9 @@ import 'package:relationship_saver/core/network/reachability/network_reachabilit
abstract class NetworkReachability {
/// Returns `true` when network looks reachable.
Future<bool> isReachable({Duration timeout = const Duration(seconds: 2)});
/// Emits reachability updates when platform network status changes.
Stream<bool> watch({Duration timeout = const Duration(seconds: 2)});
}
/// Returns platform implementation for network reachability probing.
@@ -1,9 +1,15 @@
import 'dart:async';
import 'dart:io';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:relationship_saver/core/network/reachability/network_reachability.dart';
class IoNetworkReachability implements NetworkReachability {
IoNetworkReachability({Connectivity? connectivity})
: _connectivity = connectivity ?? Connectivity();
final Connectivity _connectivity;
@override
Future<bool> isReachable({
Duration timeout = const Duration(seconds: 2),
@@ -19,6 +25,35 @@ class IoNetworkReachability implements NetworkReachability {
return false;
}
}
@override
Stream<bool> watch({Duration timeout = const Duration(seconds: 2)}) {
final Stream<dynamic> changes =
_connectivity.onConnectivityChanged as Stream<dynamic>;
return changes
.asyncMap((dynamic event) async {
final Iterable<ConnectivityResult> results =
_normalizeConnectivityResults(event);
final bool hasTransport = results.any(
(ConnectivityResult result) => result != ConnectivityResult.none,
);
if (!hasTransport) {
return false;
}
return isReachable(timeout: timeout);
})
.distinct();
}
Iterable<ConnectivityResult> _normalizeConnectivityResults(dynamic event) {
if (event is ConnectivityResult) {
return <ConnectivityResult>[event];
}
if (event is List<ConnectivityResult>) {
return event;
}
return const <ConnectivityResult>[];
}
}
NetworkReachability createPlatformNetworkReachability() =>
@@ -7,6 +7,11 @@ class StubNetworkReachability implements NetworkReachability {
}) async {
return true;
}
@override
Stream<bool> watch({Duration timeout = const Duration(seconds: 2)}) {
return const Stream<bool>.empty();
}
}
NetworkReachability createPlatformNetworkReachability() =>
@@ -8,6 +8,11 @@ class WebNetworkReachability implements NetworkReachability {
// Web environments vary in available probes; keep optimistic fallback.
return true;
}
@override
Stream<bool> watch({Duration timeout = const Duration(seconds: 2)}) {
return const Stream<bool>.empty();
}
}
NetworkReachability createPlatformNetworkReachability() =>