在很多时候,我们在涉及UI代码和业务逻辑时会分开关注。这在我们在Flutter中使用的大多数状态管理解决方案中都得到了体现。
在许多状态管理解决方案中,业务逻辑位于视图文件(小部件文件)之外,在某些情况下,我们希望基于浮动的逻辑来显示小吃店。
但是要显示Snackbar
,我们首先需要一个上下文对象。我使用了NavigatorState来进行导航,而没有上下文。但我不知道是否有一种方法可以显示没有上下文的SnackBar
。
有人可以为此提供解决方案吗?
如果您可以提供一种内部管理状态的实用程序方法,并且每当用户想要显示小吃栏时,只需从其逻辑部分调用该实用程序方法,这将非常有帮助。
答案 0 :(得分:0)
您肯定可以在没有上下文的情况下显示一条信息,类似于snackbar
,但是它不是snackbar
。
如果您使用the package Get,则可以在不使用context
的情况下进行导航,而可以在代码中的任何位置打开dialogs
,snackbars
或bottomsheets
。但是,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