others - 在Flutter应用程序上,检查有没有可用的Internet连接

我有一个网络调用要执行。但是在调用之前,我需要检查设备有没有互联网连接。

这是我到目前为止所做的:


 var connectivityResult = new Connectivity().checkConnectivity();// User defined class


 if (connectivityResult == ConnectivityResult.mobile ||


 connectivityResult == ConnectivityResult.wifi) {*/


 this.getData();


 } else {


 neverSatisfied();


 }



以上方法无效。

时间:

使用


dependencies:


 connectivity: ^0.4.2



我们从资源得到


 import 'package:connectivity/connectivity.dart';



 Future<bool> check() async {


 var connectivityResult = await (Connectivity().checkConnectivity());


 if (connectivityResult == ConnectivityResult.mobile) {


 return true;


 } else if (connectivityResult == ConnectivityResult.wifi) {


 return true;


 }


 return false;


 }



Future对我来说有点问题,我们必须每一次都要实现它:


check().then((intenet) {


 if (intenet != null && intenet) {


 // Internet Present Case


 }


 // No-Internet Case


 });



为了解决这个问题,我创建了一个类,它接受带有布尔isNetworkPresent参数的函数,


methodName(bool isNetworkPresent){}



实用程序类


import 'package:connectivity/connectivity.dart';



class NetworkCheck {


 Future<bool> check() async {


 var connectivityResult = await (Connectivity().checkConnectivity());


 if (connectivityResult == ConnectivityResult.mobile) {


 return true;


 } else if (connectivityResult == ConnectivityResult.wifi) {


 return true;


 }


 return false;


 }



 dynamic checkInternet(Function func) {


 check().then((intenet) {


 if (intenet != null && intenet) {


 func(true);


 }


 else{


 func(false);


 }


 });


 }


}



并使用connectivity-check程序


 fetchPrefrence(bool isNetworkPresent) {


 if(isNetworkPresent){



 }else{



 }


 }



我使用这个语法


NetworkCheck networkCheck = new NetworkCheck();


networkCheck.checkInternet(fetchPrefrence)



我想原因是路由器缓存了域名的查找结果,因此它不必每个查询去请求DNS服务器。

无论如何,如果你像我一样使用Firestore,你可以用空事务替换try socketexception catch块,并捕获TimeoutExceptions :


try {


 await Firestore.instance.runTransaction((Transaction tx) {}).timeout(Duration(seconds: 5));


 hasConnection = true;


} on PlatformException catch(_) { // May be thrown on Airplane mode


 hasConnection = false;


} on TimeoutException catch(_) {


 hasConnection = false;


}



你应该添加一个catch,它将捕捉所有其他异常(为了安全),或者完全删除异常类型,处理所有异常:

案例1:


try {


 await Firestore.instance


 .runTransaction((Transaction tx) {})


 .timeout(Duration(seconds: 5));


 hasConnection = true;


} on PlatformException catch(_) { // May be thrown on Airplane mode


 hasConnection = false;


} on TimeoutException catch(_) {


 hasConnection = false;


} catch (_) {


 hasConnection = false;


}



或者更简单。

案例2:





try {


 await Firestore.instance


 .runTransaction((Transaction tx) {})


 .timeout(Duration(seconds: 5));


 hasConnection = true;


} catch (_) {


 hasConnection = false;


}



...