Flutter:是不是可以在 main.dart 中实现一次快餐栏,例如,当连接状态发生变化时,用于所有屏幕

Posted

技术标签:

【中文标题】Flutter:是不是可以在 main.dart 中实现一次快餐栏,例如,当连接状态发生变化时,用于所有屏幕【英文标题】: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;
    
  

我需要检查我创建的所有屏幕中的连接状态。我可以对所有屏幕执行一次吗,或者我必须单独检查每个屏幕的连接性。

【问题讨论】:

【参考方案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 的上下文调用。 这对你有帮助:***.com/questions/57267165/… subscription = connectionStatusController.stream.listen((status) 在这一行我没有变量connectionStatusController,要收听连接状态我怎样才能让它收听这个 您可以尝试使用您在 ConnectivityService 类中创建的相同变量。

以上是关于Flutter:是不是可以在 main.dart 中实现一次快餐栏,例如,当连接状态发生变化时,用于所有屏幕的主要内容,如果未能解决你的问题,请参考以下文章

[Flutter] lib/main.dart:1: Warning: Interpreting this as package URI, 'package:flutter_app/main.

Flutter 的 main.dart 文件在 Android Studio 中执行时卡在“将文件同步到为 x86 64 构建的设备 Android SDK ...”

自动完成/智能感知不适用于 VSCode 中的 dart/flutter

跳过编译 flutter_web|web/main.dart] 因为它的一些库有这个平台不支持的 sdk 依赖项

Flutter加载不同的环境变量获取不同的配置参数

如果我只使用flutter web(没有android或ios应用程序),我还应该在index.html和main.dart中初始化firebase应用程序两次吗?