在flutter上使用Firebase云消息传递在推送通知上打开某些页面

ali*_*ali 5 dart flutter

我已经设法使用Firebase云消息传递将通知推送到我的flutter应用程序。我现在想做的是,一旦我单击通知,它将直接转到应用程序具有的特定页面。如何将通知重定向到特定页面?谢谢

ish*_*aan 4

我的 FCM 课上有这样的内容:

\n\n
static StreamController<Map<String, dynamic>> _onMessageStreamController =\n      StreamController.broadcast();\nstatic StreamController<Map<String, dynamic>> _streamController =\n      StreamController.broadcast();\nstatic final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();\nstatic final Stream<Map<String, dynamic>> onFcmMessage =\n      _streamController.stream;\n\nstatic setupFCMListeners() {\n    print("Registered FCM Listeners");\n    _firebaseMessaging.configure(\n      onMessage: (Map<String, dynamic> message) async {\n        _onMessageStreamController.add(message);\n      },\n      onLaunch: (Map<String, dynamic> message) async {\n        _streamController.add(message);\n      },\n      onResume: (Map<String, dynamic> message) async {\n        _streamController.add(message);\n      },\n    );\n  }\n\n  static Widget handlePath(Map<String, dynamic> dataMap) {\n    var path = dataMap["route"];\n    var id = dataMap["id"];\n    return handlePathByRoute(path, id);\n  }\n\n  static Widget handlePathByRoute(String route, String routeId) {\n    switch (route) {\n      case "user":\n        return Profile(guid: routeId);\n      case "event":\n        return EventInfo(eventId: routeId);\n      case "messaging":\n        return MessagingView(guid: routeId);\n      default:\n        return null;\n    }\n  }\n
Run Code Online (Sandbox Code Playgroud)\n\n

main.dart订阅了 onFcmMessage 流,但您不需要流来完成这一切。此外,您还需要一些代码来处理流失败和关闭。

\n\n

但是,当应用程序进入前台时,它会在onMessage回调或onLaunch或上收到消息onResume。在 FCM flutter pub 文档上检查它们的差异。

\n\n

方法handlePathhandlePathByRoute是通常我的 main.dart 或其他侦听通知的类调用以获取要路由到的路径的方法,但您可以通过替换此处的流代码来直接调用它们,例如:

\n\n
static setupFCMListeners() {\n    print("Registered FCM Listeners");\n    _firebaseMessaging.configure(\n      onMessage: (Map<String, dynamic> message) async {\n        print("Message: $message"); // Not handling path since on notification in app it can be weird to open a new page randomly.\n      },\n      onLaunch: (Map<String, dynamic> message) async {\n        handlePath(message);\n      },\n      onResume: (Map<String, dynamic> message) async {\n        handlePath(message);\n      },\n    );\n  }\n
Run Code Online (Sandbox Code Playgroud)\n\n

老实说,这可能不是最好的方法,但由于缺乏文档,这就是我现在正在使用的方法。我很想尝试 G\xc3\xbcnter Z\xc3\xb6chbauer\ 的方法,并在可能的情况下保存一些对象创建!

\n\n

希望这有帮助!:)

\n\n

编辑:ProfileEventInfoMessagingView扩展的三个类StatefulWidget,如果不清楚,抱歉。

\n\n

您还可以尝试使用命名路由,它们像 api 路由一样更容易,避免大量导入并拥有中央路由器,但据我所知它们缺乏转换配置。

\n