FirebaseMessaging.instance.getInitialMessage() 不适用于启动画面

Ric*_*ond 2 flutter firebase-cloud-messaging flutter-getx

在 GetX 状态管理的帮助下,我已将 Firebase Cloud Messaging 集成到我的 Flutter 移动应用中。我还使用 Laravel 和 Firebase Admin SDK 向我的应用程序发送通知。

\n

该通知在前台状态和后台状态(已暂停)下都运行良好。当我单击应用程序处于终止状态(应用程序关闭)的通知时,问题就开始了。我是否必须在启动画面和主页之间设置延迟?

\n

我已经尝试这样做但仍然出现错误

\n
//open notif content from terminated state of the app\nFirebaseMessaging.instance.getInitialMessage().then((message) {\n  if (message != null) {\n    print('TERMINATED');\n    if (FirebaseAuth.instance.currentUser != null) {\n      final redirectRoute = message.data['route'];\n      if (redirectRoute != null) {    \n        //adding delay here since my splashscreen have the same delay        \n        Future.delayed(const Duration(seconds: 6));\n        bottomnavbarController.updateIndex(int.parse(redirectRoute));\n      }\n    } else {\n      Get.offAllNamed(Routes.LOGIN);\n    }\n  }\n});\n
Run Code Online (Sandbox Code Playgroud)\n

我收到这个错误

\n
Unhandled Exception: \nYou are trying to use contextless \nnavigation without a GetMaterialApp or Get.key\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的 main.dart

\n
    //open notif content from terminated state of the app\n    FirebaseMessaging.instance.getInitialMessage().then((message) {\n      if (message != null) {\n        if (FirebaseAuth.instance.currentUser == null) {\n          Get.offAllNamed(Routes.LOGIN);\n        } else {\n          final redirectRoute = message.data['route'];\n          if (redirectRoute != null) {\n            print('TERMINATED');\n            bottomnavbarController.updateIndex(int.parse(redirectRoute));\n          }\n        }\n      }\n    });\n   \n\n  @override\n  Widget build(BuildContext context) {\n    final authController = Get.put(AuthController(), permanent: true);\n    return FutureBuilder(\n      future: Future.delayed(const Duration(seconds: 6)),\n      builder: (context, snapshot) {\n        if (snapshot.connectionState == ConnectionState.done) {\n          return Obx(\n            () => GetMaterialApp(\n              debugShowCheckedModeBanner: false,              \n              title: "Application",\n              theme: ThemeData(\n                appBarTheme: const AppBarTheme(\n                    elevation: 0.2,\n                    foregroundColor: Colors.black,\n                    backgroundColor: Colors.white),\n              ),\n              initialRoute: authController.isSkipIntro.isTrue\n                  ? authController.isAuthAndVerified.isTrue\n                      ? Routes.PAGEWRAPPER\n                      : Routes.LOGIN\n                  : Routes.INTRODUCTION,\n              getPages: AppPages.routes,\n            ),\n          );\n        }\n\n        return FutureBuilder(\n          future: authController.firstInitialize(),\n          builder: (context, snapshot) {\n            return const SplashScreen();\n          },\n        );\n      },\n    );\n  }\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的底部导航控制器

\n
class BottomnavbarController extends GetxController {\n  final bottomNavIndex = 0.obs;  \n  \n  void updateIndex(int index){\n    bottomNavIndex.value = index;\n    Get.offAllNamed(Routes.PAGEWRAPPER);\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是日志

\n
Launching lib\\main.dart on RNE L22 in release mode...\nRunning Gradle task 'assembleRelease'...                           76.4s\n\xe2\x88\x9a  Built build\\app\\outputs\\flutter-apk\\app-release.apk (10.0MB).\nInstalling build\\app\\outputs\\flutter-apk\\app.apk...                 3.4s\n\nFlutter run key commands.\nh List all available interactive commands.       \nc Clear the screen\nq Quit (terminate the application on the device).\nW/FlutterJNI(10061): FlutterJNI.loadLibrary called more than once\nW/FlutterJNI(10061): FlutterJNI.prefetchDefaultFontManager called more than once\nW/FlutterJNI(10061): FlutterJNI.init called more than once\nW/FlutterJNI(10239): FlutterJNI.loadLibrary called more than once\nW/FlutterJNI(10239): FlutterJNI.init called more than once\nI/flutter (10239): Handling a background message: 0:1646807530074172%f77b2610f77b2610\nI/flutter (10239): TERMINATED\nE/flutter (10239): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: You are trying to use contextless navigation without\nE/flutter (10239):       a GetMaterialApp or Get.key.\nE/flutter (10239):       If you are testing your app, you can use:\nE/flutter (10239):       [Get.testMode = true], or if you are running your app on\nE/flutter (10239):       a physical device or emulator, you must exchange your [MaterialApp]\nE/flutter (10239):       for a [GetMaterialApp].\nE/flutter (10239):\nE/flutter (10239): #0      GetNavigation.global (package:get/get_navigation/src/extension_navigation.dart:1094)\nE/flutter (10239): #1      GetNavigation.offAllNamed (package:get/get_navigation/src/extension_navigation.dart:786)\nE/flutter (10239): #2      BottomnavbarController.updateIndex (package:prototypeapp/app/modules/bottomnavbar/controllers/bottomnavbar_controller.dart:9)\nE/flutter (10239): #3      _MyAppState.initState.<anonymous closure> (package:prototypeapp/main.dart:64)\nE/flutter (10239): #4      _rootRunUnary (dart:async/zone.dart:1434)\nE/flutter (10239): <asynchronous suspension>\nE/flutter (10239): \nI/flutter (10239): Null check operator used on a null value\nI/flutter (10239): #0      PageRedirect.page (package:get/get_navigation/src/routes/route_middleware.dart:199)\nI/flutter (10239): #1      GetMaterialApp.initialRoutesGenerate (package:get/get_navigation/src/root/get_material_app.dart:348)\nI/flutter (10239): #2      _WidgetsAppState.build.<anonymous closure> (package:flutter/src/widgets/app.dart:1556)\nI/flutter (10239): #3      NavigatorState.restoreState (package:flutter/src/widgets/navigator.dart:3290)\nI/flutter (10239): #4      RestorationMixin._doRestore (package:flutter/src/widgets/restoration.dart:887)\nI/flutter (10239): #5      RestorationMixin.didChangeDependencies (package:flutter/src/widgets/restoration.dart:873)\nI/flutter (10239): #6      NavigatorState.didChangeDependencies (package:flutter/src/widgets/navigator.dart:3336)\nI/flutter (10239): #7      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4914)\nI/flutter (10239): #8      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)\nI/flutter (10239): #9      Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)\nI/flutter (10239): #10     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)\nI/flutter (10239): #11     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)\nI/flutter (10239): #12     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)\nI/flutter (10239): #13     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)\nI/flutter (10239): #14     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)\nI/flutter (10239): #15     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)\nI/flutter (10239): #16     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)\nI/flutter (10239): #17     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)\nI/flutter (10239): #18     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)\nI/flutter (10239): #19     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)\nI/flutter (10239): #20     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)\nI/flutter (10239): #21     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)\nI/flutter (10239): #22     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)\nI/flutter (10239): #23     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)\nI/flutter (10239): #24     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)\nI/flutter (10239): #25     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)\nI/flutter (10239): #26     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)\nI/flutter (10239): #27     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)\nI/flutter (10239): #28     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)\nI/flutter (10239): #29     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)\nI/flutter (10239): #30     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)\nI/flutter (10239): #31     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)\nI/flutter (10239): #32     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)\nI/flutter (10239): #33     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)\nI/flutter (10239): #34     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)\nI/flutter (10239): #35     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)\nI/flutter (10239): #36     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)\nI/flutter (10239): #37     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)\nI/flutter (10239): #38     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)\nI/flutter (10239): #39     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)\nI/flutter (10239): #40     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)\nI/flutter (10239): #41     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)\nI/flutter (10239): #42     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)\nI/flutter (10239): #43     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)\nI/flutter (10239): #44     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)\nI/flutter (10239): #45     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)\nI/flutter (10239): #46     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)\nI/flutter (10239): #47     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)\nI/flutter (10239): #48     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)\nI/flutter (10239): #49     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)\nI/flutter (10239): #50     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)\nI/flutter (10239): #51     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)\nI/flutter (10239): #52     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)\nI/flutter (10239): #53     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)\nI/flutter (10239): #54     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)\nI/flutter (10239): #55     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)\nI/flutter (10239): #56     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)\nI/flutter (10239): #57     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)\nI/flutter (10239): #58     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)\nI/flutter (10239): #59     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)\nI/flutter (10239): #60     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4928)\nI/flutter (10239): #61     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)\nI/flutter (10239): #62     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)\nI/flutter (10239): #63     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4919)\nI/flutter (10239): #64     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)\nI/flutter (10239): #65     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)\nI/flutter (10239): #66     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)\nI/flutter (10239): #67     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)\nI/flutter (10239): #68     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)\nI/flutter (10239): #69     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)\nI/flutter (10239): #70     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)\nI/flutter (10239): #71     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)\nI/flutter (10239): #72     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)\nI/flutter (10239): #73     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)\nI/flutter (10239): #74     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4928)\nI/flutter (10239): #75     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)\nI/flutter (10239): #76     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)\nI/flutter (10239): #77     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4919)\nI/flutter (10239): #78     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)\nI/flutter (10239): #79     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)\nI/flutter (10239): #80     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)\nI/flutter (10239): #81     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)\nI/flutter (10239): #82     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)\nI/flutter (10239): #83     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)\nI/flutter (10239): #84     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)\nI/flutter (10239): #85     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)\nI/flutter (10239): #86     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)\nI/flutter (10239): #87     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)\nI/flutter (10239): #88     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)\nI/flutter (10239): #89     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)\nI/flutter (10239): #90     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)\nI/flutter (10239): #91     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)\nI/flutter (10239): #92     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)\nI/flutter (10239): #93     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)\nI/flutter (10239): #94     Element.rebuild (package:flutter/src/widgets/framework.dart:4477)\nI/flutter (10239): #95     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735)\nI/flutter (10239): #96     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729)\nI/flutter (10239): #97     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790)\nI/flutter (10239): #98     Element.updateChild (package:flutter/src/widgets/framework.dart:3540)\nI/flutter (10239): #99     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780)\n
Run Code Online (Sandbox Code Playgroud)\n

Ric*_*ond 6

我现在已经用替代解决方案解决了这个问题。这是main.dart

@override
void initState() {
  super.initState();

  //open notif content from terminated state of the app
  FirebaseMessaging.instance.getInitialMessage().then((message) {
    if (message != null) {
      print('TERMINATED');
      final redirectRoute = message.data['route'];
      print('redirectRoute $redirectRoute');
      bottomnavbarController.updateIndex(int.parse(redirectRoute));
      //remove redirect route here, so the unknownRoute will trigger the default route
    }
  });

  //only works if app in foreground
  FirebaseMessaging.onMessage.listen((message) {
    LocalNotificationService.display(message);
  });

  //onclick notif system tray only works if app in background but not termi
  FirebaseMessaging.onMessageOpenedApp.listen((message) {
    final redirectRoute = message.data['route'];
    if (redirectRoute != null) {
      print('BACKGROUND');
      print('redirectRoute $redirectRoute');
      bottomnavbarController.updateIndex(int.parse(redirectRoute));
      Get.offAllNamed(Routes.PAGEWRAPPER);
    }
  });
}

@override
Widget build(BuildContext context) {
  final authController = Get.put(AuthController(), permanent: true);
  return FutureBuilder(
    future: Future.delayed(const Duration(seconds: 6)),
    builder: (context, snapshot) {
      if (snapshot.connectionState == ConnectionState.done) {
        return Obx(
          () => GetMaterialApp(
              debugShowCheckedModeBanner: false,
              title: "Application",
              theme: ThemeData(
                appBarTheme: const AppBarTheme(
                    elevation: 0.2,
                    foregroundColor: Colors.black,
                    backgroundColor: Colors.white),
              ),
              initialRoute: authController.isSkipIntro.isTrue
                  ? authController.isAuthAndVerified.isTrue
                      ? Routes.PAGEWRAPPER
                      : Routes.LOGIN
                  : Routes.INTRODUCTION,
              getPages: AppPages.routes,
              unknownRoute: authController.isAuthAndVerified.isTrue ? AppPages.routes[11] : AppPages.routes[1],
          ),
        );
      }
      return FutureBuilder(
        future: authController.firstInitialize(),
        builder: (context, snapshot) {
          return const SplashScreen();
        },
      );
    },
  );
}
Run Code Online (Sandbox Code Playgroud)

如果路由为 null,我添加了此unknownRoute:内容GetMaterialApp,它将数组传递给AppPages类内 pagewrapper o 登录页面的索引,因为 in 中的路由getInitialMessage()返回 null。

我已经使用 Get.key 进行了定义,但仍然返回 null。也许app_routes.dart在 GetMaterialApp 之前还没有创建。也许这就是它返回 null 的原因。

我仍然不知道为什么会发生这种情况。也许这是 GetX 插件的一个错误。不管怎样,这对我来说仍然有效,因为我已经更新了底部导航索引。