如何解决Flutter:当连接状态更改时,是否可以在main.dart中一次实现一个小吃栏,例如在所有屏幕上
- 我对连接进行枚举:
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();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。