问题描述
- 我对连接进行枚举:
enum ConnectivityStatus{
Wifi,Cellular,Offline
}
- 然后我创建一项服务来检查连通性:
import 'dart:async';
import 'package:Zabatnee/activities_app/enum/connectivity_status.dart';
import 'package:connectivity/connectivity.dart';
class ConnectivityService{
StreamController<ConnectivityStatus> connectionStatusController = StreamController<ConnectivityStatus>();
ConnectivityService(){
Connectivity().onConnectivityChanged.listen((ConnectivityResult result) {
var connectionStatus = _getStatusFromresult(result);
connectionStatusController.add(connectionStatus);
});
}
ConnectivityStatus _getStatusFromresult(ConnectivityResult result) {
switch (result) {
case ConnectivityResult.mobile:
return ConnectivityStatus.Cellular;
case ConnectivityResult.wifi:
return ConnectivityStatus.Wifi;
case ConnectivityResult.none:
return ConnectivityStatus.Offline;
default:
return ConnectivityStatus.Offline;
}
}
}
- ,我需要在创建的所有屏幕中检查连接状态。我可以对所有屏幕一次做一次,还是必须逐一检查每个屏幕的连通性?
解决方法
您可以检查一次连接状态,并将在您的所有应用程序中实现。
您只需要创建一个包装器类并订阅Connectivity
流并在该包装器类中应用逻辑即可。
您的整个小部件都将被该小部件包裹。
MaterialApp(
..
home: ConnectivityWrapper(
childWidget: YourWidget(),// replace this with your own home widget
),);
包装器小部件将如下所示:
class ConnectivityWrapper extends StatefulWidget {
ConnectivityWrapper(this.childWidget);
final Widget childWidget;
@override
_ConnectivityWrapperState createState() => _ConnectivityWrapperState();
}
class _ConnectivityWrapperState extends State<ConnectivityWrapper> {
StreamSubscription<ConnectivityStatus> subscription;
@override
void initState() {
super.initState();
subscription = connectionStatusController.stream.listen((status)
{
if(status == ConnectivityStatus.Offline) {
// Your logic here (Toast message or something else)
}
},onDone() {
// Your logic here
},onError: () {
// Your logic here
});
}
@override
Widget build(BuildContext context) {
return widget.childWidget;
}
@override
void dispose() {
// unsubscribe to the stream
subscription.cancel();
super.dispose();
}
}