如何在不显示上下文对象的情况下显示Snackbar?

时间:2020-05-16 16:49:27

标签: flutter dart flutter-layout flutter-animation

在很多时候,我们在涉及UI代码和业务逻辑时会分开关注。这在我们在Flutter中使用的大多数状态管理解决方案中都得到了体现。

在许多状态管理解决方案中,业务逻辑位于视图文件(小部件文件)之外,在某些情况下,我们希望基于浮动的逻辑来显示小吃店。

但是要显示Snackbar,我们首先需要一个上下文对象。我使用了NavigatorState来进行导航,而没有上下文。但我不知道是否有一种方法可以显示没有上下文的SnackBar

有人可以为此提供解决方案吗?

如果您可以提供一种内部管理状态的实用程序方法,并且每当用户想要显示小吃栏时,只需从其逻辑部分调用该实用程序方法,这将非常有帮助。

2 个答案:

答案 0 :(得分:0)

您肯定可以在没有上下文的情况下显示一条信息,类似于snackbar,但是它不是snackbar

如果您使用the package Get,则可以在不使用context的情况下进行导航,而可以在代码中的任何位置打开dialogssnackbarsbottomsheets。但是,snackbars特别存在一些问题。

由于它不检查Scaffold,因此snackbar直接显示在屏幕底部。这意味着如果您拥有BottomNavigationBar,它将被其覆盖或部分覆盖。

这也意味着,如果您拥有FloatingActionButton,则不会响应snackbar的位置,而不会像普通snackbar那样响应。

总而言之,使用Get,您可以拥有snackbars而没有context,但是您将不得不在UI中做出一些牺牲。

示例

final bottomSnackBar = GetBar(
  isDismissible: false,
  showProgressIndicator: true,
  message: 'Processing...',
);

bottomSnackBar.show();

somethingAsync().then((_) => bottomSnackBar.hide());

答案 1 :(得分:0)

您可以指定 scaffoldMessengerKey 作为 MaterialApp 的属性,然后可以直接使用 ScaffoldMessenger 而无需 BuildContext

我认为你可以像 navigatorKey 一样。

参考:https://api.flutter.dev/flutter/material/MaterialApp/scaffoldMessengerKey.html