Flutter显示无上下文的SnackBar

cidc1ykv  于 2023-02-25  发布在  Flutter
关注(0)|答案(2)|浏览(158)

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

lp0sw83n

lp0sw83n1#

建议使用Kaival所指出的软件包并不是正确的方法,因为除了依赖第三方软件包和在有时不需要的时候过度设计你的应用程序之外,你不会学到解决问题的正确方法。
你使用一个没有上下文的SnackBar,实际上通过一个key是非常简单的,你可以在任何地方创建一个GlobalKey<ScaffoldState>,然后把它分配给你想显示SnackBarScaffold

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,您可能需要考虑将其添加到您的根MaterialAppScaffoldMessengerState,以便您可以在任何地方使用它。

final GlobalKey<ScaffoldMessengerState> rootScaffoldMessengerKey = GlobalKey<ScaffoldMessengerState>();
MaterialApp(
  scaffoldMessengerKey: rootScaffoldMessengerKey,
  home: ...
)

并据此命名

rootScaffoldMessengerKey.currentState.showSnackBar();

有关详细信息,请参阅docs

mo49yndu

mo49yndu2#

你好,你可以使用globalkey作为与你的MaterialApp关联的导航键。这将允许你最终导航到错误屏幕或其他任何地方。
使用globalkey,您将能够在任何地方检索上下文(至少当您的应用处于前台并且实际上存在上下文时)。
虽然并不总是推荐使用全局变量,但你可以这样做:在主目录中创建一个包含以下键的GlobalVariable类:

class GlobalVariable {
  /// This global key is used in material app for navigation through firebase notifications.
  static final GlobalKey<NavigatorState> navigatorState = GlobalKey<NavigatorState>();
}

而不是在MaterialApp中将键声明为导航键:

MaterialApp(
        navigatorKey: GlobalVariable.navigatorState,

最后访问所有位置的密钥和上下文:

GlobalVariable.navigatorState.currentContext

相关问题