navigatorKey.currentContext始终为空

4

当 FCM 后台消息接收时,我想切换到一个屏幕。但是为了做到这一点,需要 context,而在 FirebaseBackgroundMessageHandler 中我肯定没有这个参数。于是我在网上搜索后发现可以从 NavigatorKey 获取当前的上下文,因此我创建了这个全局变量:

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

我的材料应用程序中有这个:

runApp(GetMaterialApp(
    navigatorKey: navigatorKey,
    home: const MyHomePage(),));

现在,每当我收到后台消息时,我尝试切换到所需的屏幕,但我总是得到空上下文,因此不能Push。通过GetX导航也会抛出错误。 我错过了什么?请帮忙!!!

Firebase 后台处理程序:

Future<dynamic> firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp();
  if(message.data['test'] == '123'){
    Navigator.of(navigatorKey.currentContext!).push(MaterialPageRoute(builder: (context) =>const Wallet()));
  }
}
1个回答

3
根据 Firebase 背景消息的文档,如下所述:

由于处理程序在应用程序上下文之外的自己的隔离区内运行,因此无法更新应用程序状态或执行任何影响UI的逻辑。但是,您可以执行诸如 HTTP 请求、IO 操作(更新本地存储)、与其他插件通信等逻辑。

所以,如果您的应用程序处于后台,则无法像您希望的那样启动导航。如果向用户显示通知,则用户可以决定单击它,然后您可以使用 FirebaseMessaging.onMessageOpenedApp。在该处理程序中,您将能够处理导航。

谢谢,但我的 FirebaseMessaging.onMessageOpenedApp 从未被调用。这是我的代码:FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { print(message.toString()); Get.to(()=> const Wallet()); }); 我不知道我做错了什么。 - Siddharth Mehra
1
那么当应用程序在后台运行时,您的通知会显示出来,用户点击它,但 onMessageOpenedApp 没有执行? - Peter Koltai
我的错,如果我发送一个可见通知它会执行,但是如果我使用 这个 包显示通知,它也会执行吗? - Siddharth Mehra
1
FlutterLocalNotificationsPlugin有一个initialize方法,你在设置时必须调用它。使用这个方法,你可以设置一个onSelectNotification函数,当用户点击使用此包显示的通知时,该函数将被执行。 - Peter Koltai
在像callkeep这样的包中,它是如何工作的呢?当应用程序被终止时,callkeep包会显示本机通话界面。监听器被放置在firebaseMessagingBackgroundHandler中,正如上面所说,使用navigation.currentContext失败了,因为它在另一个隔离区中。点击接受按钮后可以做什么呢? - thewebjackal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接