Flutter 在没有上下文的情况下显示 SnackBar

标签 flutter

我有一个 flutter 应用程序,它在应用程序的不同屏幕上发出许多不同的 http 请求。现在,我想实现一些通用的错误处理,例如,每当没有连接时,我都想显示一个 SnackBar,无论我目前在应用程序中的哪个位置。我设法编写了一个方法,每次在我的一个请求中出现异常时都会调用该方法。现在,我想在此方法中显示 SnackBar。但是我无法访问此方法中的 BuildContext,也无法将其作为参数传递给该方法。
那么,有没有办法在没有上下文的情况下显示 SnackBar?例如,获取当前事件屏幕的上下文,然后使用它来显示 SnackBar 的方法?

最佳答案

建议使用 Kaival 所指出的软件包并不是正确的方法,因为除了依赖 3rd 方软件包之外,您不会为您的问题学习正确的解决方案,并且在有时不需要时也会使用那些过度设计您的应用程序。
涂用SnackBar没有上下文,它实际上非常简单,通过 key .您可以创建一个 GlobalKey<ScaffoldState>无论您想要什么,并将其分配给 Scaffold您想在何处显示 SnackBar .

GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

Widget build(BuildContext context) {
   return Scaffold(key: _scaffoldKey);
}
然后在任何你想要的地方,你可以检查它的状态以启动 SnackBar像这样:
void foo() {
 if(_scaffoldKey.currentState != null) {
   _scaffoldKey.currentState.showSnackBar();
 }
}
您只需要确保状态已安装(即,您想要的 Scaffold 在显示之前可用。
只要确保您使用的是新的 ScaffoldMessenger您可能需要考虑将其添加到您的根 API MaterialApp ScaffoldMessengerState所以你可以在任何地方使用它。
final GlobalKey<ScaffoldMessengerState> rootScaffoldMessengerKey = GlobalKey<ScaffoldMessengerState>();
MaterialApp(
  scaffoldMessengerKey: rootScaffoldMessengerKey,
  home: ...
)
并相应地调用它
rootScaffoldMessengerKey.currentState.showSnackBar();
引用 docs了解更多信息。

关于Flutter 在没有上下文的情况下显示 SnackBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68846785/

相关文章:

flutter - 如何将文本字段的标签转移到前缀图标的顶部而不是文本

android - Flutter 更改所选选项卡的背景

Flutter - 在构建期间调用 setState() 或 markNeedsBuild()

flutter - 使用Future时无法将值存储到Flutter/Dart中的类变量

flutter - Flutter应用程序无法渲染,出现错误 “Bottom overflowed by infinite pixels”

flutter 错误 : Execution failed for task ':app:compileDebugJavaWithJavac'

firebase - 无法在两者的最新版本上使用 firebase 编译 flutter 应用程序

image - 如何确定应用程序使用的图像的大小?

excel - 如何使用应用将 Firebase 数据导出到 Excel 表格中?

android - 将 FlutterFragment 添加到 Activity?