【问题标题】:Flutter : is it possible to implement a snackbar one time in main.dart for example for all screen when the connectivity status changedFlutter:是否可以在 main.dart 中实现一次快餐栏,例如,当连接状态发生变化时,用于所有屏幕
【发布时间】:2021-02-13 18:12:18
【问题描述】:
  • 我为连接创建了一个枚举:
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;
    }
  }
}
  • 我需要检查我创建的所有屏幕中的连接状态。我可以对所有屏幕执行一次吗,或者我必须单独检查每个屏幕的连接性。

【问题讨论】:

    标签: flutter dart widget provider connectivity


    【解决方案1】:

    您可以检查一次连接状态,这将适用于您的所有应用。

    您只需创建一个包装类并订阅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();
      }
    }
    

    【讨论】:

    • 谢谢,当我使用诸如打印之类的东西时它可以工作,但是当我尝试使用小吃店时[Scaffold.of(context).showSnackBar(]......我收到了这个错误[Scaffold .of() 使用不包含 Scaffold 的上下文调用。
    • subscription = connectionStatusController.stream.listen((status) 在这一行我没有变量connectionStatusController,要收听连接状态我怎样才能让它收听这个
    • 您可以尝试使用您在 ConnectivityService 类中创建的相同变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 2016-10-31
    相关资源
    最近更新 更多