Flutter onclick of Notification redirect to a new page not working

问题描述 投票:0回答:0

当点击通知时,它应该根据它获得的有效负载数据打开新屏幕。 我已经使用 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 创建新方法,但没有用。

感谢您的关注和帮助。我被这个问题困扰了很长时间。你的帮助会让我开心。谢谢。

android flutter push-notification firebase-cloud-messaging unhandled-exception
© www.soinside.com 2019 - 2024. All rights reserved.