【发布时间】:2021-03-31 11:54:13
【问题描述】:
我正在使用 Firebase Cloud Messaging 包进行颤振。 我希望每当用户点击收到的通知时,flutter 应用程序都会打开并根据 fcm 发送的数据导航到特定屏幕。
但是当应用程序在后台或应用程序关闭时,我无法实现所需的行为,因为永远不会调用 onResume 和 onLaunch 处理程序。我已经尝试了一些解决方案,比如创建通知通道,使用类似的包 flutter_local_notifications 等。但对我没有任何帮助。
这是我处理 fcm 相关任务的 FirebaseMessagingService 类
class FirebaseMessagingService {
final FirebaseMessaging _fcm = FirebaseMessaging();
final RouterService _routerService = locator<RouterService>();
final LocalStorageService _localStorage = locator<LocalStorageService>();
Future initialise() async {
if (Platform.isIOS) {
_fcm.requestNotificationPermissions(IosNotificationSettings());
}
_fcm.configure(
onMessage: (Map<String, dynamic> message) async {
Map<String, dynamic> arguments = {};
Map<String, dynamic> data = message['data'];
if (data.containsKey('argument')) {
if (data.containsKey('value')) {
arguments[data['argument']] = data['value'];
}
}
_routerService.navigationKey.currentState
.pushReplacementNamed('${data['route']}', arguments: arguments);
},
onLaunch: (Map<String, dynamic> message) async {
Map<String, dynamic> arguments = {};
Map<String, dynamic> data = message['data'];
if (data.containsKey('argument')) {
if (data.containsKey('value')) {
arguments[data['argument']] = data['value'];
}
}
_routerService.navigationKey.currentState
.pushReplacementNamed('${data['route']}', arguments: arguments);
},
onResume: (Map<String, dynamic> message) async {
Map<String, dynamic> arguments = {};
Map<String, dynamic> data = message['data'];
if (data.containsKey('argument')) {
if (data.containsKey('value')) {
arguments[data['argument']] = data['value'];
}
}
_routerService.navigationKey.currentState
.pushReplacementNamed('${data['route']}', arguments: arguments);
},
onBackgroundMessage: _myBackgroundMessageHandler);
}
static Future<dynamic> _myBackgroundMessageHandler(
Map<String, dynamic> message) async {
final RouterService _routerService = locator<RouterService>();
if (message.containsKey('data')) {
// Handle data message
Map<String, dynamic> arguments = {};
Map<String, dynamic> data = message['data'];
if (data.containsKey('argument')) {
if (data.containsKey('value')) {
arguments[data['argument']] = data['value'];
}
}
_routerService.navigationKey.currentState
.pushReplacementNamed('${data['route']}', arguments: arguments);
}
if (message.containsKey('notification')) {
// Handle notification message
final dynamic notification = message['notification'];
}
}
}
谁能帮我解决这个问题?
【问题讨论】:
标签: firebase flutter notifications firebase-cloud-messaging