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();
  }
}