Flutter - 如何获取当前上下文?

Posted

技术标签:

【中文标题】Flutter - 如何获取当前上下文?【英文标题】:Flutter - how to get current context? 【发布时间】:2020-04-22 22:48:10 【问题描述】:

我正在使用 Firebase 云消息传递通知,当我在应用程序内收到通知时,我想显示一个对话框或快餐栏,我的问题是我正在初始化我的小部件树顶部的 firebase 配置(应用程序启动后的启动画面)

_fireBaseMessaging.configure(
  onMessage: (Map<String, dynamic> message) async 
    dynamic data = message['data'];
    ................ // Adding a snackbar/alertdialog here doesn't work
  ,
);

显然,如果我设置了一个对话框或小吃栏,它不会显示,因为我需要当前页面的上下文,有没有办法获取当前上下文?

我也尝试将它放在启动屏幕的构建小部件中,但是一旦我在另一个页面上,对话框仍然没有显示。

 @override
  Widget build(BuildContext context) 
    _fireBaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async 
        print("onMessage: $message");
        dynamic data = message['data'];
        if (data['id'] == '1') 
          newPro = true;
         else if (data['id'] == '2') 
          print("THIS WORKS!!!");
          showDialog(
              context: context,
              builder: (context) => AlertDialog(
                    content: ListTile(
                      title: Text("TEST"),
                      subtitle: Text("TEST"),
                    ),
                    actions: <Widget>[
                      FlatButton(
                        child: Text("OK"),
                        onPressed: () => Navigator.pop(context),
                      )
                    ],
                  ));
        
      ,
    );

【问题讨论】:

【参考方案1】:

因为将答案嵌入链接让我感到不舒服,所以这里是答案(感谢 Github 上的 xqwzts)。

使用您可以从任何地方访问的 GlobalKey 进行导航:

创建密钥:

final GlobalKey<NavigatorState> navigatorKey = new GlobalKey<NavigatorState>();

将其传递给您的应用程序:

new MaterialApp(
      title: 'MyApp',
      onGenerateRoute: generateRoute,
      navigatorKey: navigatorKey,
    );

推送路线:

navigatorKey.currentState.pushNamed('/someRoute');

【讨论】:

【参考方案2】:

我遇到了完全相同的问题,但我在 GitHub 上找到了一个很棒的帖子。基本上,您可以创建一个 navigatorKey 并将其传递给 MaterialApp,然后使用该 navigatorKey 更改路由。

在此线程中查看如何:https://github.com/brianegan/flutter_redux/issues/5#issuecomment-361215074

【讨论】:

这确实是一个精彩的线程。我认为这应该是公认的答案,因为这是解决所述问题的最佳方法 谢谢我的朋友!!!它对我有很大帮助!!!【参考方案3】:

我最终使用了 Overlay 支持:

https://pub.dev/packages/overlay_support

它基本上是在我的树的最开始被调用的,就像在 main.dart 中包装提供者一样,它就像一个魅力,没有其他任何作用! 这里还有一个对我帮助很大的教程:

https://medium.com/flutter-community/in-app-notifications-in-flutter-9c1e92ea10b3

【讨论】:

使用包来完成小手段并不是一个很好的做法。根据经验,请确保在安装之前需要一半以上的包方法。【参考方案4】:

在树中第一个小部件的构建方法中进行初始化!它通常称为 App 小部件,它是 StateLess StateFull 小部件,在构建方法中您可以访问 BuildContext

【讨论】:

已经试过了,没用,正在打印,但没有显示对话框。

以上是关于Flutter - 如何获取当前上下文?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 AlertDialog 的宽高 - Flutter Web

如何在 Flutter 中获取当前位置时显示加载微调器?

如何使用 Flutter 从 Firebase 获取当前活跃用户?

如何在 Dart/Flutter 中获取当前时间的 GMT 时间偏移值

如何在 Flutter 中从 Firebase 获取当前用户 ID

如何快速获取Flutter安装目录