Pour tous ceux qui atterrissent ici, j'aimerais ajouter à la réponse de Günter Zöchbauer qu'il s'agissait de ma solution pour mettre en œuvre un utilitaire permettant de savoir s'il y a Internet ou non, indépendamment de toute autre chose.
Avis de non-responsabilité :
Je suis novice à la fois dans Dart et Flutter, donc ce n'est peut-être pas la meilleure approche, mais j'aimerais bien avoir des retours.
Combinaison de flutter_connectivity et du test de connexion de Günter Zöchbauer
Mes exigences
Je ne voulais pas avoir un tas de code répété partout où j'avais besoin de vérifier la connexion et je voulais qu'il mette automatiquement à jour les composants ou tout autre élément qui s'occupe de la connexion à chaque fois qu'il y avait un changement.
ConnectionStatusSingleton
D'abord, on installe un Singleton. Si vous n'êtes pas familier avec ce modèle, il y a beaucoup d'informations intéressantes en ligne à son sujet. Mais l'essentiel est que vous voulez créer une seule instance d'une classe pendant le cycle de vie de l'application et être capable de l'utiliser n'importe où.
Ce singleton s'accroche à flutter_connectivity
et écoute les changements de connectivité, puis teste la connexion réseau, puis utilise une StreamController
pour mettre à jour tout ce qui compte.
Ça ressemble à ça :
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;
}
}
Utilisation
Initialisation
Tout d'abord, nous devons nous assurer que nous appelons l'initialisation de notre singleton. Mais seulement une fois. C'est à vous de voir, mais je l'ai fait dans mon application. main()
:
void main() {
ConnectionStatusSingleton connectionStatus = ConnectionStatusSingleton.getInstance();
connectionStatus.initialize();
runApp(MyApp());
//Call this if initialization is occuring in a scope that will end during app lifecycle
//connectionStatus.dispose();
}
Sur Widget
ou ailleurs
import 'dart:async'; //For StreamSubscription
...
class MyWidgetState extends State<MyWidget> {
StreamSubscription _connectionChangeStream;
bool isOffline = false;
@override
initState() {
super.initState();
ConnectionStatusSingleton connectionStatus = ConnectionStatusSingleton.getInstance();
_connectionChangeStream = connectionStatus.connectionChange.listen(connectionChanged);
}
void connectionChanged(dynamic hasConnection) {
setState(() {
isOffline = !hasConnection;
});
}
@override
Widget build(BuildContext ctxt) {
...
}
}
J'espère que quelqu'un d'autre trouvera cela utile !
Exemple de dépôt github : https://github.com/dennmat/flutter-connectiontest-example
Passez en mode avion dans l'émulateur pour voir le résultat.