打开应用程序后,整个应用程序都会显示FCM通知(Flutter)

时间:2020-08-05 09:13:31

标签: android flutter notifications firebase-cloud-messaging

我现在正在使用FCM将推送通知发送到我的设备,并且运行正常。但是,当应用程序打开时,只有在该特定页面中时,我才会执行onResume。无论用户位于哪个页面(或班级),我都希望在顶部显示通知。 基本上,我希望通知在全球范围内显示(显示弹出窗口)。任何帮助,将不胜感激。这是显示通知的页面中的代码。

document.querySelector("monthDays:nth-child(day+document.querySelectorAll('.prev-date').length)").css("background-color", "yellow");

}

1 个答案:

答案 0 :(得分:2)

将您的MaterialApp包装在包装器类中……让我们调用FCMWrapper。

class FCMWrapper extends StatefulWidget {
  final Widget child;

  const FCMWrapper({Key key, this.child}) : super(key: key);

  @override
  _FCMWrapperState createState() => _FCMWrapperState();
}

class _FCMWrapperState extends State<FCMWrapper> {
  @override
  Widget build(BuildContext context) {
    return Consumer<YourObservable>(
      builder: (context, yourObservable, _) {
        if (yourObservable != null && yourObservable.isNotEmpty) {
          Future(
            () => navigatorKey.currentState.push(
              PushNotificationRoute(
                  child: YourViewOnNotification(),
              )),
            ),
          );
        }
        return widget.child;
      },
    );
  }
}

我将数据存储在一个单独的类中的可观察对象中。因此,当我收到通知时,我将更新可观察值。由于我们正在使用该可观察的对象,因此将调用PushNotificationRoute。

PushNotificationRoute只是扩展ModalRoute的类。

class PushNotificationRoute extends ModalRoute {
  final Widget child;

  PushNotificationRoute({this.child});

  ... //Override other methods to your requirement

  //This is important
  @override
  Widget buildPage(BuildContext context, Animation<double> animation,
      Animation<double> secondaryAnimation) {
    return SafeArea(
      child: Builder(builder: (BuildContext context) {
        return child;
      }),
    );
  }

  ...
  @override
  Duration get transitionDuration => Duration(milliseconds: 200);
}

现在main.dart中声明一个像这样的全局密钥

var navigatorKey = GlobalKey<NavigatorState>();

像这样包装您的MaterialApp

...

FCMWrapper(
          child: MaterialApp(
            navigatorKey: navigatorKey,
            title: 'Your App',

...

因此,现在每次在您的可观察对象中收到通知时,都应更新并推送将在应用程序中的任何位置显示的模式路线。