【问题标题】:navigatorKey.currentContext is Always NullnavigatorKey.currentContext 始终为 Null
【发布时间】:2022-01-11 06:13:59
【问题描述】:

我想在收到 FCM 背景消息时切换到屏幕。但是对于这个 context 是必需的,我的 Firebase 后台消息处理程序中肯定没有,所以我在互联网上搜索,发现我可以从 navigator key 获取上下文,所以我创建了这个全局变量:

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

这在我的材料应用程序上:

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

现在,每当我收到背景消息时,我都会尝试切换到所需的屏幕,但我总是得到空上下文,所以无法Push。浏览GetX 也会引发错误。 我错过了什么?请帮忙!!!!

myFB 后台处理程序:

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

【问题讨论】:

    标签: android flutter flutter-getx


    【解决方案1】:

    根据 Firebase 后台消息的documentation

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

    因此,如果您的应用程序在后台,您将无法按照您希望的方式启动导航。如果您向用户显示通知,用户可以决定单击它,然后您可以使用FirebaseMessaging.onMessageOpenedApp。在这个处理程序中,您将能够处理导航。

    【讨论】:

    • 谢谢,但我的FirebaseMessaging.onMessageOpenedApp 从未调用过。这是我的代码:FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { print(message.toString()); Get.to(()=&gt; const Wallet()); });我不知道我做错了什么。
    • 所以你的通知会在应用在后台显示,用户点击,onMessageOpenedApp不执行?
    • 我的错,如果我发送可见通知它会执行,但是当我使用this 包显示通知时它也会执行吗?
    • FlutterLocalNotificationsPlugin有一个initialize方法,设置的时候需要调用,通过这个方法可以设置一个onSelectNotification函数,当用户点击时执行在使用此包显示的通知上。
    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2022-01-20
    • 2016-01-14
    相关资源
    最近更新 更多