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 _onlineController = StreamController.broadcast(); StreamSubscription>? _subscription; bool _isOnline = true; Stream get onlineChanges => _onlineController.stream; bool get isOnline => _isOnline; Future initialize() async { if (kIsWeb) { _isOnline = true; _onlineController.add(true); return; } final List results = await _connectivity .checkConnectivity(); _emitOnline(_resultsOnline(results)); _subscription = _connectivity.onConnectivityChanged.listen( (List results) => _emitOnline(_resultsOnline(results)), ); } void dispose() { _subscription?.cancel(); _onlineController.close(); } bool _resultsOnline(List 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); } }