我有一个网络调用要执行。但在此之前,我需要检查设备是否有互联网连接。
这是我目前为止所做的:
var connectivityResult = new Connectivity().checkConnectivity();// User defined class
if (connectivityResult == ConnectivityResult.mobile ||
connectivityResult == ConnectivityResult.wifi) {*/
this.getData();
} else {
neverSatisfied();
}
上述方法行不通。
我为小部件状态创建了一个基类
使用BaseState<LoginPage>代替State<LoginPage>
然后使用布尔变量isOnline
Text(isOnline ? 'is Online' : 'is Offline')
首先,添加连接性插件:
dependencies:
connectivity: ^0.4.3+2
然后添加BaseState类
import 'dart:async';
import 'dart:io';
import 'package:flutter/services.dart';
import 'package:connectivity/connectivity.dart';
import 'package:flutter/widgets.dart';
/// a base class for any statful widget for checking internet connectivity
abstract class BaseState<T extends StatefulWidget> extends State {
void castStatefulWidget();
final Connectivity _connectivity = Connectivity();
StreamSubscription<ConnectivityResult> _connectivitySubscription;
/// the internet connectivity status
bool isOnline = true;
/// initialize connectivity checking
/// Platform messages are asynchronous, so we initialize in an async method.
Future<void> initConnectivity() async {
// Platform messages may fail, so we use a try/catch PlatformException.
try {
await _connectivity.checkConnectivity();
} on PlatformException catch (e) {
print(e.toString());
}
// If the widget was removed from the tree while the asynchronous platform
// message was in flight, we want to discard the reply rather than calling
// setState to update our non-existent appearance.
if (!mounted) {
return;
}
await _updateConnectionStatus().then((bool isConnected) => setState(() {
isOnline = isConnected;
}));
}
@override
void initState() {
super.initState();
initConnectivity();
_connectivitySubscription = Connectivity()
.onConnectivityChanged
.listen((ConnectivityResult result) async {
await _updateConnectionStatus().then((bool isConnected) => setState(() {
isOnline = isConnected;
}));
});
}
@override
void dispose() {
_connectivitySubscription.cancel();
super.dispose();
}
Future<bool> _updateConnectionStatus() async {
bool isConnected;
try {
final List<InternetAddress> result =
await InternetAddress.lookup('google.com');
if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
isConnected = true;
}
} on SocketException catch (_) {
isConnected = false;
return false;
}
return isConnected;
}
}
您需要像这样在您的状态下强制转换小部件
@override
void castStatefulWidget() {
// ignore: unnecessary_statements
widget is StudentBoardingPage;
}
我已经创建了一个包,(我认为)可以可靠地处理这个问题。
在pub.dev上的包
这个包在GitHub上
欢迎讨论。你可以使用GitHub上的问题跟踪器。
我不再认为这是一个可靠的方法:
想在@Oren的回答中添加一些东西:你真的应该再添加一个catch,它将捕获所有其他异常(为了安全起见),或者只是完全删除异常类型并使用一个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;
}
迟答,但用这个包来检查。
包名:data_connection_checker
在你的酒吧里。yuml文件:
dependencies:
data_connection_checker: ^0.3.4
创建一个名为connection的文件。达特,随便你叫什么都行。
导入包:
import 'package:data_connection_checker/data_connection_checker.dart';
检查是否有网络连接:
print(await DataConnectionChecker().hasConnection);
你可以使用这个包
https://pub.dev/packages/flutter_network_connectivity
它利用Android上的NetworkCapabilities和iOS上的NetworkMonitor,监听连接变化和ping来检查互联网可用性,你也可以配置为定期查找互联网可用性。
添加到你的pubspec.yaml
flutter_network_connectivity: ^0.0.6
创建对象
FlutterNetworkConnectivity flutterNetworkConnectivity =
FlutterNetworkConnectivity(
isContinousLookUp: true, // optional, false if you cont want continous lookup
lookUpDuration: const Duration(seconds: 5), // optional, to override default lookup duration
lookUpUrl: 'example.com', // optional, to override default lookup url
);
您可以使用它的方法来连续检查网络连接或调用来检查当前状态
_flutterNetworkConnectivity.getInternetAvailabilityStream().listen((isInternetAvailable) {
// do something
});
并注册监听器
await _flutterNetworkConnectivity.registerAvailabilityListener();
检查值班状态
bool _isNetworkConnectedOnCall = await _flutterNetworkConnectivity.isInternetConnectionAvailable();
我写了一个包来检查活跃的互联网连接和显示相应的小部件。
flutter_no_internet_widget
例子:
InternetWidget(
online: Text('Online'),
offline: Text('Offline),
);
根据网络状态,将显示适当的小部件。如果您有一个活跃的互联网连接,一个在线小部件将显示。
所有重量级的工作都由包完成,您所要做的就是提供在线和离线小部件。您还可以提供一个加载小部件和查找URL。
欢迎讨论、提交意见书或提出建议。