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 web(没有android或ios应用程序),我还应该在index.html和main.dart中初始化firebase应用程序两次吗?