Flutter 如何在Firebase消息配置功能中处理颤振路径导航

Flutter 如何在Firebase消息配置功能中处理颤振路径导航,flutter,Flutter,Flatter的firebase_消息包的文档建议我们在应用程序的生命周期中尽早调用configure函数。我理解为什么建议这样做。 目前我的应用程序有这种结构,当用户第一次打开应用程序时,他们会进入“第一页”,如果他们已经登录,这将决定是将他们带到“登录页”还是“MainPageOfApp”。要移动到任一页面,我使用PushReplacement,这样“FirstPage”的上下文就消失了 从技术上讲,我应该在“FirstPage”中调用firebase_messaging的configure

Flatter的firebase_消息包的文档建议我们在应用程序的生命周期中尽早调用configure函数。我理解为什么建议这样做。 目前我的应用程序有这种结构,当用户第一次打开应用程序时,他们会进入“第一页”,如果他们已经登录,这将决定是将他们带到“登录页”还是“MainPageOfApp”。要移动到任一页面,我使用PushReplacement,这样“FirstPage”的上下文就消失了

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

我的另一个解决方案是在主页中配置firebase_消息,但问题是,当我在应用程序终止时(在_启动配置时)收到通知时,应用程序首先打开主页,然后导航到通知通知通知它打开的页面(执行它在_启动时配置的操作)。我想是的

我的问题是,鉴于我将使用Navigator.pushReplacement转到下一页(“登录页面”或“主页”),因此我将丢失其上下文,如何在FirstPage中配置firebase_消息传递

谢谢

我找到了解决办法。 使用:
GlobalKey

据此:

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

然后,当消息发出时,上下文不在那里,但您有导航器的参考键,可以使用它。

\u firebasemessage.configure(
_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);
  },
);
onMessage:(映射消息)异步{ }, onBackgroundMessage:myBackgroundMessageHandler, onLaunch:(映射消息)异步{ 打印(“onLaunch:$message”); _导航项目详细信息(消息); }, onResume:(映射消息)异步{ 打印(“onResume:$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);
}
  }
void\u navigateToItemDetail(地图消息){
最终项目=_itemForMessage(消息);
//清除对话框
Navigator.popintil(context,(Route-Route)=>Route是PageRoute);
如果(!item.route.isCurrent){
推送(上下文、项、路线);
}
}
我也有这个问题。 有一个名为get的包:

在main中,您可以将MaterialApp更改为GetMaterialApp并导入: 导入“package:get/get_navigation/get_navigation.dart”

之后,转到以下位置:_firebaseMessaging.configure(); 然后创建一个函数:

goToNext(){
Get.to("The page you want to go to");
}
然后在_firebaseMessaging.configure()中;叫它

onLaunch:(映射消息)异步{
打印(“onLaunch:$message”);
goToNext();
},
onResume:(映射消息)异步{
打印(“onResume:$message”);
goToNext();
},
  onLaunch: (Map<String, dynamic> message) async {
    print("onLaunch: $message");
    goToNext();
  },
  onResume: (Map<String, dynamic> message) async {
    print("onResume: $message");
    goToNext();
  },