当点击通知时,它应该根据它获得的有效负载数据打开新屏幕。 我已经使用 if、else if、else 来确定要导航的页面,但它只能与 else 一起使用。
这是读取通知的代码。 initInfo() 从 initState() 调用。
initInfo() async {
RemoteMessage? initialMessage =
await FirebaseMessaging.instance.getInitialMessage();
var androidInitialize =
const AndroidInitializationSettings('@mipmap/ic_launcher');
var iosInitialize = const DarwinInitializationSettings();
var initializationsSettings = InitializationSettings(
android: androidInitialize, iOS: iosInitialize);
flutterLocalNotificationsPlugin.initialize(
initializationsSettings,
onDidReceiveNotificationResponse: (payload) async {
if(initialMessage?.data['screen'] == 'BloodDonation'){
await Navigator.push(
context, MaterialPageRoute(builder: (context) {
return BloodDonationViewPost(postId: initialMessage?.data['postId']);
},)
);
}else if(initialMessage?.data['screen'] == 'Course'){
await Navigator.push(
context, MaterialPageRoute(builder: (context) {
return CourseViewPost(
courseName: initialMessage?.data['courseName'],
section: initialMessage?.data['section'],
postDocNum: initialMessage?.data['postId'],
);
},));
}
else{
await Navigator.push(
context, MaterialPageRoute(builder: (context) {
return const NoticeBoardHome();
},)
);
}
},
onDidReceiveBackgroundNotificationResponse: (payload) async {
if(initialMessage?.data['screen'] == 'BloodDonation'){
await Navigator.push(
context, MaterialPageRoute(builder: (context) {
return BloodDonationViewPost(postId: initialMessage?.data['postId']);
},)
);
}else if(initialMessage?.data['screen'] == 'Course'){
await Navigator.push(
context, MaterialPageRoute(builder: (context) {
return CourseViewPost(
courseName: initialMessage?.data['courseName'],
section: initialMessage?.data['section'],
postDocNum: initialMessage?.data['postId'],
);
},));
}
else{
await Navigator.push(
context, MaterialPageRoute(builder: (context) {
return const NoticeBoardHome();
},)
);
}
},
);
FirebaseMessaging.onMessage.listen((RemoteMessage message) async {
BigTextStyleInformation bigTextStyleInformation = BigTextStyleInformation(
message.notification!.body.toString(),
htmlFormatBigText: true,
contentTitle: message.notification!.title.toString(),
htmlFormatContentTitle: true,
);
AndroidNotificationDetails androidPlatformChannelSpecifics =
AndroidNotificationDetails('gubiyan', 'gubiyan',
importance: Importance.high,
styleInformation: bigTextStyleInformation,
priority: Priority.high,
playSound: true);
NotificationDetails platformChannelSpecifics = NotificationDetails(
android: androidPlatformChannelSpecifics,
);
await flutterLocalNotificationsPlugin.show(
0, message.notification?.title, message.notification?.body,
platformChannelSpecifics, payload: message.data['screen']);
});
}
这是发送通知的代码
void sendPushMessage(String token) async{
try{
await http.post(
Uri.parse('https://fcm.googleapis.com/fcm/send'),
headers: <String, String>{
'Content-Type': 'application/json',
'Authorization': 'key=AAAAuIxrF3Q:APA91bGVfeuQfdC7O3PHTDbI1VNGlP8_uV0oPFvlfvqz6NMa10vSvmcrInRscF_zv5zvBsbGh6QBKHqT-vT_F7Hh4HnpJumfMw9601Vx2WRiz7mix300-5r7pNNiokEARVdGadHsHu5s'
},
body: jsonEncode(
<String, dynamic> {
'priority': 'high',
'data': <String, dynamic>{
'click_action': 'FLUTTER_NOTIFICATION_CLICK',
'status': 'done',
'body': descriptionController.text,
'title': '${FirebaseAuth.instance.currentUser!.displayName!} need $groupType blood at ${locationController.text}',
'screen': 'BloodDonation',
'postId': randomID,
},
'notification': <String, dynamic>{
'body': descriptionController.text,
'title': '${FirebaseAuth.instance.currentUser!.displayName!} need $groupType blood at ${locationController.text}',
'android_channel_id': 'gubiyan'
},
'to': token,
}
)
);
}catch(e) {
if(kDebugMode) {
print('Error in Push Notification');
}
}
}
这是我在应用程序打开时遇到的错误。
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: 'package:flutter_local_notifications/src/platform_flutter_local_notifications.dart': Failed assertion: line 1018 pos 12: 'callback != null': The backgroundHandler needs to be either a static function or a top
E/flutter ( 4859): level function to be accessible as a Flutter entry point.(package:flutter_local_notifications/src/platform_flutter_local_notifications.dart:148:5)
E/flutter ( 4859): #4 FlutterLocalNotificationsPlugin.initialize (package:flutter_local_notifications/src/flutter_local_notifications_plugin.dart:142:13)
E/flutter ( 4859): #5 _HomePageState.initInfo (package:unistudent/Screens/home_page.dart:266:37)
E/flutter ( 4859): <asynchronous suspension>
我已经尝试为 backgroundHandler 创建新方法,但没有用。
感谢您的关注和帮助。我被这个问题困扰了很长时间。你的帮助会让我开心。谢谢。