颤振-如何获取当前上下文?

时间:2020-01-04 20:03:42

标签: firebase flutter firebase-cloud-messaging

我正在使用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),
                      )
                    ],
                  ));
        }
      },
    );

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我最终使用了Overlay支持:

https://pub.dev/packages/overlay_support

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

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

答案 2 :(得分:0)

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

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