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});\nRun Code Online (Sandbox Code Playgroud)\n我收到这个错误
\nUnhandled Exception: \nYou are trying to use contextless \nnavigation without a GetMaterialApp or Get.key\nRun 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 }\nRun Code Online (Sandbox Code Playgroud)\n这是我的底部导航控制器
\nclass 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}\nRun Code Online (Sandbox Code Playgroud)\n这是日志
\nLaunching 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)\nRun Code Online (Sandbox Code Playgroud)\n
我现在已经用替代解决方案解决了这个问题。这是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 插件的一个错误。不管怎样,这对我来说仍然有效,因为我已经更新了底部导航索引。
| 归档时间: |
|
| 查看次数: |
8226 次 |
| 最近记录: |