Created
May 8, 2020 11:53
-
-
Save hafizhfadh/ba44100a06efc58e7d5d7a9c2e715546 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// Created by Hafizh Fadhlurrohman on 05/03/20. | |
/// Al Wafi Islamic Boarding School | |
/// [email protected] | |
import 'dart:io'; //InternetAddress utility | |
import 'dart:async'; //For StreamController/Stream | |
import 'package:connectivity/connectivity.dart'; | |
class ConnectionStatusSingleton { | |
//This creates the single instance by calling the `_internal` constructor specified below | |
static final ConnectionStatusSingleton _singleton = new ConnectionStatusSingleton._internal(); | |
ConnectionStatusSingleton._internal(); | |
//This is what's used to retrieve the instance through the app | |
static ConnectionStatusSingleton getInstance() => _singleton; | |
//This tracks the current connection status | |
bool hasConnection = false; | |
//This is how we'll allow subscribing to connection changes | |
StreamController connectionChangeController = new StreamController.broadcast(); | |
//flutter_connectivity | |
final Connectivity _connectivity = Connectivity(); | |
//Hook into flutter_connectivity's Stream to listen for changes | |
//And check the connection status out of the gate | |
void initialize() { | |
_connectivity.onConnectivityChanged.listen(_connectionChange); | |
checkConnection(); | |
} | |
Stream get connectionChange => connectionChangeController.stream; | |
//A clean up method to close our StreamController | |
// Because this is meant to exist through the entire application life cycle this isn't | |
// really an issue | |
void dispose() { | |
connectionChangeController.close(); | |
} | |
//flutter_connectivity's listener | |
void _connectionChange(ConnectivityResult result) { | |
checkConnection(); | |
} | |
//The test to actually see if there is a connection | |
Future<bool> checkConnection() async { | |
bool previousConnection = hasConnection; | |
try { | |
final result = await InternetAddress.lookup('google.com'); | |
if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) { | |
hasConnection = true; | |
} else { | |
hasConnection = false; | |
} | |
} on SocketException catch(_) { | |
hasConnection = false; | |
} | |
//The connection status changed send out an update to all listeners | |
if (previousConnection != hasConnection) { | |
connectionChangeController.add(hasConnection); | |
} | |
return hasConnection; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment