À toute personne qui atterrit ici, j'aimerais ajouter à la réponse de Günter Zöchbauer que voici ma solution pour implémenter une utilité pour savoir s'il y a internet ou non, peu importe tout le reste.
Avertissement :
Je suis novice à la fois en Dart et en Flutter, donc ce n'est peut-être pas la meilleure approche, mais j'aimerais recevoir des retours.
Combinaison de flutter_connectivity et du test de connexion de Günter Zöchbauer
Mes exigences
Je ne voulais pas avoir du code répété partout où je devais vérifier la connexion et je voulais qu'elle mette automatiquement à jour les composants ou tout autre élément qui se soucie de la connexion à chaque changement.
ConnectionStatusSingleton
Tout d'abord, nous mettons en place un Singleton. Si vous n'êtes pas familier avec ce modèle, il y a beaucoup d'informations disponibles en ligne à ce sujet. L'idée est de créer une seule instance d'une classe pendant le cycle de vie de l'application et de pouvoir l'utiliser n'importe où.
Ce singleton se connecte à flutter_connectivity
et écoute les changements de connectivité, testant ensuite la connexion réseau, puis utilisant un StreamController
pour mettre à jour tout élément qui en a besoin.
Voici à quoi cela ressemble :
import 'dart:io'; //Utilitaire InternetAddress
import 'dart:async'; //Pour StreamController/Stream
import 'package:connectivity/connectivity.dart';
class ConnectionStatusSingleton {
//Cela crée la seule instance en appelant le constructeur `_internal` spécifié ci-dessous
static final ConnectionStatusSingleton _singleton = new ConnectionStatusSingleton._internal();
ConnectionStatusSingleton._internal();
//C'est ce qui est utilisé pour récupérer l'instance dans l'application
static ConnectionStatusSingleton getInstance() => _singleton;
//Cela suit l'état actuel de la connexion
bool hasConnection = false;
//C'est ainsi que nous permettrons de s'abonner aux changements de la connexion
StreamController connectionChangeController = new StreamController.broadcast();
//flutter_connectivity
final Connectivity _connectivity = Connectivity();
//Se connecter au Stream de flutter_connectivity pour écouter les changements
//Et vérifier l'état de la connexion dès le départ
void initialize() {
_connectivity.onConnectivityChanged.listen(_connectionChange);
checkConnection();
}
Stream get connectionChange => connectionChangeController.stream;
//Une méthode de nettoyage pour fermer notre StreamController
// Comme cela est censé exister pendant tout le cycle de vie de l'application, ce n'est pas
// vraiment un problème
void dispose() {
connectionChangeController.close();
}
//Écouteur de flutter_connectivity
void _connectionChange(ConnectivityResult result) {
checkConnection();
}
//Le test pour voir effectivement s'il y a une connexion
Future 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;
}
//Le statut de connexion a changé, envoyer une mise à jour à tous les auditeurs
if (previousConnection != hasConnection) {
connectionChangeController.add(hasConnection);
}
return hasConnection;
}
}
Utilisation
Initialisation
Tout d'abord, nous devons nous assurer d'appeler l'initialisation de notre singleton. Mais une seule fois. C'est à vous de décider, mais je l'ai fait dans la fonction main()
de mon application :
void main() {
ConnectionStatusSingleton connectionStatus = ConnectionStatusSingleton.getInstance();
connectionStatus.initialize();
runApp(MyApp());
//Appelez ceci si l'initialisation se produit dans un contexte qui se terminera pendant le cycle de vie de l'application
//connectionStatus.dispose();
}
Dans un Widget
ou ailleurs
import 'dart:async'; //Pour StreamSubscription
...
class MyWidgetState extends State {
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 !
Référentiel Github d'exemple : https://github.com/dennmat/flutter-connectiontest-example
Activez le mode avion dans l'émulateur pour voir le résultat