[英]Problem while checking internet connectivity on flutter
I was trying to check the internet connection on my flutter app with the help of connectivity plus package and a function which I saw in one of the answers of stackoverflaw.我试图在连接加包和我在 stackoverflaw 的一个答案中看到的一个功能的帮助下检查我的 flutter 应用程序上的互联网连接。 Below is the code:下面是代码:
connectivity_check.dart连通性_check.dart
import 'dart:async';
import 'dart:io';
import 'package:connectivity_plus/connectivity_plus.dart';
enum ConnectivityStatus { Online, Offline }
class ConnectivityService {
// Create our public controller
StreamController<ConnectivityStatus> connectionStatusController =
StreamController<ConnectivityStatus>();
final _connectivity = Connectivity();
ConnectivityService() {
// Subscribe to the connectivity Chanaged Steam
_connectivity.onConnectivityChanged.listen((ConnectivityResult result) {
_checkStatus(result);
});
void _checkStatus(ConnectivityResult result) async {
bool isOnline = false;
try {
final result = await InternetAddress.lookup('example.com');
isOnline = result.isNotEmpty && result[0].rawAddress.isNotEmpty;
print(isOnline);
} on SocketException catch (_) {
isOnline = false;
}
if (isOnline == true)
connectionStatusController.sink.add(ConnectivityStatus.Online);
else
connectionStatusController.sink.add(ConnectivityStatus.Offline);
}
void disposeStream() => connectionStatusController.close();
}
StreamProvider in main.dart main.dart 中的 StreamProvider
StreamProvider<ConnectivityStatus>(
initialData: ConnectivityStatus.Online,
create: (_) =>
ConnectivityService().connectionStatusController.stream)
The Widget where I am using this connectivity provider我在其中使用此连接提供程序的小部件
class OfferPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: (Provider.of<ConnectivityStatus>(context) ==
ConnectivityStatus.Online)
? ListView(
children: [
OfferImage(image: 'offer_banner.jpg'),
OfferImage(image: 'offer1.jpg'),
OfferImage(image: 'offer2.jpg'),
],
)
: Text('ok'),
);
}
}
The problem which I am facing is that the isOnline is always returning true even if I switch off my Wifi/data.我面临的问题是,即使我关闭了 Wifi/数据,isOnline 也总是返回 true。 Whenever stream provider listens to change in network, it returns true/Online, it doesn't return false/Offline.每当流提供程序侦听网络中的变化时,它都会返回 true/Online,它不会返回 false/Offline。 Can someone help and debug the code?有人可以帮助和调试代码吗?
Avoid _checkStatus call which used InternetAddress.lookup
, as we already have ConnectivityResult
, its better to use that only.避免使用InternetAddress.lookup
_checkStatus 调用,因为我们已经有了ConnectivityResult
,最好只使用它。
Package( https://pub.dev/packages/connectivity/install ):包( https://pub.dev/packages/connectivity/install ):
connectivity: ^3.0.6
Connectivity.dart连通性.dart
import 'dart:async';
import 'package:connectivity/connectivity.dart';
class ConnectivityService {
ConnectivityService() {
Connectivity().onConnectivityChanged.listen((ConnectivityResult result) {
connectionController.add(_getStatus(result));
});
}
StreamController<ConnectivityStatus> connectionController =
StreamController<ConnectivityStatus>();
ConnectivityStatus _getStatus(ConnectivityResult result) {
switch (result) {
case ConnectivityResult.wifi:
return ConnectivityStatus.Online;
case ConnectivityResult.mobile:
return ConnectivityStatus.Online;
case ConnectivityResult.none:
return ConnectivityStatus.Offline;
default:
return ConnectivityStatus.Online;
}
}
}
enum ConnectivityStatus { Online, Offline }
Register Provider:注册提供商:
StreamProvider<ConnectivityStatus>(
create: (context) => ConnectivityService().connectionController.stream),
Usage:用法:
var connectionStatus = Provider.of<ConnectivityStatus>(context);
if (connectionStatus == ConnectivityStatus.Online) {
/// Online logic
} else {
/// Offline logic
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.