Flutter 显示没有上下文的 SnackBar

Apr*_*pri 13 flutter

我有一个 flutter 应用程序,它在应用程序的不同屏幕中发出许多不同的 http 请求。现在,我想实现一些常规错误处理,例如,每当没有连接时,我想显示一个 SnackBar,无论我当前在应用程序中的哪个位置。我设法编写了一种方法,每次我的请求出现异常时都会调用该方法。现在,我想在这个方法中显示 SnackBar。但我无权访问此方法中的 BuildContext,也无法将其作为参数传递给该方法。

那么,有没有办法在没有上下文的情况下显示 SnackBar 呢?例如,获取当前活动屏幕的上下文,然后使用它来显示 SnackBar 的方法?

Mig*_*ivo 15

建议使用 Kaival 指出的包并不是正确的方法,因为除了依赖第 3 方包以及有时不需要时使用这些包过度设计您的应用程序之外,您不会学到解决问题的正确解决方案。

在没有上下文的情况下使用 aSnackBar实际上通过 a 非常简单keyGlobalKey<ScaffoldState>您可以在任意位置创建并将其分配到Scaffold要显示SnackBar.

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

Widget build(BuildContext context) {
   return Scaffold(key: _scaffoldKey);
}
Run Code Online (Sandbox Code Playgroud)

然后您可以在任何您想要的地方检查其状态以启动SnackBar

void foo() {
 if(_scaffoldKey.currentState != null) {
   _scaffoldKey.currentState.showSnackBar();
 }
}
Run Code Online (Sandbox Code Playgroud)

您只需要在显示之前确保状态已安装(即Scaffold您想要的状态可用)。

只要确保您正在使用新的ScaffoldMessengerAPI,您可能需要考虑将其添加到您的 root MaterialAppa中,以便您可以在任何地方ScaffoldMessengerState使用它。

final GlobalKey<ScaffoldMessengerState> rootScaffoldMessengerKey = GlobalKey<ScaffoldMessengerState>();
MaterialApp(
  scaffoldMessengerKey: rootScaffoldMessengerKey,
  home: ...
)
Run Code Online (Sandbox Code Playgroud)

并相应地调用它

rootScaffoldMessengerKey.currentState.showSnackBar();
Run Code Online (Sandbox Code Playgroud)

请参阅文档以获取更多信息。