import 'dart:io'; import 'package:connectivity_plus/connectivity_plus.dart'; abstract class ConnectivityStatusService { Future isConnectedToInternet(); Future isServerReachable(String serverAddress); Stream connectivityChanges(); } class ConnectivityStatusServiceImpl implements ConnectivityStatusService { final Connectivity connectivity; ConnectivityStatusServiceImpl(this.connectivity); @override Stream connectivityChanges() { return connectivity.onConnectivityChanged .map(_hasActiveInternetConnection) .asBroadcastStream(); } @override Future isConnectedToInternet() async { return _hasActiveInternetConnection( await (Connectivity().checkConnectivity())); } @override Future isServerReachable(String serverAddress) async { try { var uri = Uri.parse(serverAddress); final result = await InternetAddress.lookup(uri.host); if (result.isNotEmpty && result.first.rawAddress.isNotEmpty) { return true; } else { return false; } } on SocketException catch (_) { return false; } } bool _hasActiveInternetConnection(ConnectivityResult conn) { return conn == ConnectivityResult.mobile || conn == ConnectivityResult.wifi || conn == ConnectivityResult.ethernet; } }