我已经设法使用Firebase云消息传递将通知推送到我的flutter应用程序。我现在想做的是,一旦我单击通知,它将直接转到应用程序具有的特定页面。如何将通知重定向到特定页面?谢谢
答案 0 :(得分:2)
在我的FCM课堂上,我有这样的事情:
static StreamController<Map<String, dynamic>> _onMessageStreamController =
StreamController.broadcast();
static StreamController<Map<String, dynamic>> _streamController =
StreamController.broadcast();
static final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
static final Stream<Map<String, dynamic>> onFcmMessage =
_streamController.stream;
static setupFCMListeners() {
print("Registered FCM Listeners");
_firebaseMessaging.configure(
onMessage: (Map<String, dynamic> message) async {
_onMessageStreamController.add(message);
},
onLaunch: (Map<String, dynamic> message) async {
_streamController.add(message);
},
onResume: (Map<String, dynamic> message) async {
_streamController.add(message);
},
);
}
static Widget handlePath(Map<String, dynamic> dataMap) {
var path = dataMap["route"];
var id = dataMap["id"];
return handlePathByRoute(path, id);
}
static Widget handlePathByRoute(String route, String routeId) {
switch (route) {
case "user":
return Profile(guid: routeId);
case "event":
return EventInfo(eventId: routeId);
case "messaging":
return MessagingView(guid: routeId);
default:
return null;
}
}
我的main.dart
订阅了onFcmMessage流,但是您不需要流来完成所有这一切。另外,您需要一些代码来处理流失败和关闭。
但是,当应用程序出现在前台时,它将通过onMessage
回调或onLaunch
或onResume
回调获取消息。在FCM flutter pub文档上检查它们之间的差异。
方法handlePath
和handlePathByRoute
是通常我的main.dart或其他侦听通知的类调用的方法,以获取要路由到的路径,但是您只需替换流就可以直接调用它们代码如下:
static setupFCMListeners() {
print("Registered FCM Listeners");
_firebaseMessaging.configure(
onMessage: (Map<String, dynamic> message) async {
print("Message: $message"); // Not handling path since on notification in app it can be weird to open a new page randomly.
},
onLaunch: (Map<String, dynamic> message) async {
handlePath(message);
},
onResume: (Map<String, dynamic> message) async {
handlePath(message);
},
);
}
说实话,这甚至可能不是最佳方法,甚至不是一个好的方法,但是由于缺乏文档,这就是我目前正在使用的方法。我很想尝试GünterZöchbauer的方法,并尽可能保存一些对象创建!
希望这会有所帮助! :)
编辑:Profile
,EventInfo
和MessagingView
是扩展StatefulWidget
的三个类,如果不清楚,抱歉。
您还可以尝试使用命名路由,它们使它们像api路由一样容易,并且避免了很多导入操作,并且具有中央路由器,但是AFAIK他们缺少过渡配置。
答案 1 :(得分:0)
不要忘记在通知数据中添加 click_action。
'click_action': 'FLUTTER_NOTIFICATION_CLICK'
看到这个