如何在Firebase Messaging Configure功能中处理Flutter路线导航

时间:2019-12-29 11:05:53

标签: flutter

Flutter的firebase_messaging软件包的文档建议我们在应用程序的生命周期中尽早调用configure函数。我了解为什么建议这样做。 当前,我的应用具有这种结构,当用户首次打开该应用时,他们会转到“ FirstPage”,该页面决定是将他们带入“ LoginPage”还是“ MainPageOfApp”(如果已经登录)。要移至任一页面,我使用PushReplacement,所以“ FirstPage”的上下文消失了。

从技术上讲,我应该在“第一页”中调用firebase_messaging的配置,因为这是最早的机会,但是这行不通,因为当我导航到两个后续页面(LoginPage或MainPage)中的任何一个时,我都会丢失第一页的上下文)。这是一个问题,因为我将firebase_messaging配置为在收到通知时导航到某个页面,但是配置firebase_messaging的上下文没有消失。

我的另一种解决方案是在MainPage中配置firebase_messaging,但问题是当我收到应用终止时的通知(on_launch配置)时,该应用会先打开MainPage 然后,然后导航到该页面通知告诉它打开(执行on_launch中配置的操作)。应该是我想的。

我的问题是,鉴于我将丢失其上下文,因此我将如何在FirstPage中配置firebase_messaging,因为我将使用Navigator.pushReplacement转到下一页(“ LoginPage”或“ MainPage”)。

谢谢!

3 个答案:

答案 0 :(得分:1)

_firebaseMessaging.configure(
  onMessage: (Map<String, dynamic> message) async {   
  },
  onBackgroundMessage: myBackgroundMessageHandler,
  onLaunch: (Map<String, dynamic> message) async {
    print("onLaunch: $message");
    _navigateToItemDetail(message);
  },
  onResume: (Map<String, dynamic> message) async {
    print("onResume: $message");
    _navigateToItemDetail(message);
  },
);

您的导航功能将类似于:

 void _navigateToItemDetail(Map<String, dynamic> message) {
final Item item = _itemForMessage(message);
// Clear away dialogs
Navigator.popUntil(context, (Route<dynamic> route) => route is PageRoute);
if (!item.route.isCurrent) {
  Navigator.push(context, item.route);
}
  }

答案 1 :(得分:0)

我找到了解决方案。 采用 : GlobalKey<NavigatorState>

据此:How to navigate without context in flutter app?

并将密钥传递给FirebaseMessaging.configure()方法。

然后,当消息到来时,上下文不存在,但是您具有导航器的引用键,就可以使用它。

答案 2 :(得分:0)

我也有这个问题。 有一个名为get的软件包:https://pub.dev/packages/get

在您的主目录中,您可以将MaterialApp更改为GetMaterialApp并导入: 导入'package:get / get_navigation / get_navigation.dart';

之后转到您拥有的位置:_firebaseMessaging.configure(); 然后只需创建一个函数:

goToNext(){
Get.to("The page you want to go to");
}

然后在_firebaseMessaging.configure();中叫它

  onLaunch: (Map<String, dynamic> message) async {
    print("onLaunch: $message");
    goToNext();
  },
  onResume: (Map<String, dynamic> message) async {
    print("onResume: $message");
    goToNext();
  },