【发布时间】:2021-02-25 11:20:39
【问题描述】:
我的主要想法是在 Flutter 端通过 FCM 接收推送通知,并在 Android 原生代码端启动可自定义的通知。 我已经设法在原生 Android 代码中创建通知,并通过 MethodChannel 的 invokeMethod 调用 Flutter。 当应用程序在前台时,没有问题,我可以实时接收推送通知并显示在本机代码中实现的通知。
这里的问题是,当应用程序在后台时,我通过 FCM 接收通知数据,在 onBackgroundMessage 方法中没有任何问题,但我无法执行 invokeMethod 来显示通知,因为它给了我 MissingPluginException 错误。
firebaseCloudMessagingListener(BuildContext context) {
//* iOS Config
_messaging.requestNotificationPermissions(IosNotificationSettings(sound: true, badge: true, alert: true));
_messaging.onIosSettingsRegistered.listen((event) {
print('Registered: $event');
});
_messaging.configure(
onBackgroundMessage: Platform.isIOS ? null : onBackgroundMessageHandler,
//* When app is in foreground (open)
onMessage: (Map<String, dynamic> message) async {
NotificationHandler.showNotification(message['data']); //* This works
},
//* When app is in background
onResume: (Map<String, dynamic> message) async {},
//* When app is closed
onLaunch: (Map<String, dynamic> message) async {});
}
static Future onBackgroundMessageHandler(Map<String, dynamic> message) async {
if (message['data'] != null) {
dynamic data = message['data'];
print("Receive notification in background");
NotificationHandler.showNotification(Map<String, dynamic>.from(data)); //! This gives MissingPluginException error
}
return Future<void>.value();
}
显示通知方式:
static void showNotification(var message) async {
const channel = MethodChannel('channel.luis/notifications');
channel.invokeMethod('showNotification', {
"title": message['title'],
"description": message['body'],
"type": message['ntfType'],
});
}
日志:
I/flutter ( 4160): Receive notification in background
E/flutter ( 4160): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: MissingPluginException(No implementation found for method showNotification on channel channel.luis/notifications)
E/flutter ( 4160): #0 MethodChannel._invokeMethod
package:flutter/…/services/platform_channel.dart:157
E/flutter ( 4160): <asynchronous suspension>
E/flutter ( 4160): #1 MethodChannel.invokeMethod
package:flutter/…/services/platform_channel.dart:332
E/flutter ( 4160): #2 FirebaseNotifications.onBackgroundMessageHandler
package:fact_mobile_app/firebase/firebase_notification_handler.dart:53
E/flutter ( 4160): #3 _fcmSetupBackgroundChannel.<anonymous closure>
package:firebase_messaging/firebase_messaging.dart:38
E/flutter ( 4160): #4 MethodChannel._handleAsMethodCall
package:flutter/…/services/platform_channel.dart:430
E/flutter ( 4160): #5 MethodChannel.setMethodCallHandler.<anonymous closure>
package:flutter/…/services/platform_channel.dart:383
E/flutter ( 4160): #6 _DefaultBinaryMessenger.handlePlatformMessage
package:flutter/…/services/binding.dart:283
E/flutter ( 4160): #7 _invoke3.<anonymous closure> (dart:ui/hooks.dart:280:15)
E/flutter ( 4160): #8 _rootRun (dart:async/zone.dart:1190:13)
E/flutter ( 4160): #9 _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter ( 4160): #10 _CustomZone.runGuarded (dart:async/zone.dart:997:7)
E/flutter ( 4160): #11 _invoke3 (dart:ui/hooks.dart:279:10)
E/flutter ( 4160): #12 _dispatchPlatformMessage (dart:ui/hooks.dart:154:5)
E/flutter ( 4160):
有人可以帮帮我吗?谢谢!
【问题讨论】:
标签: flutter firebase-cloud-messaging