“FirebaseMessaging”类没有默认构造函数 Flutter 2

问题描述

在切换到 Flutter 2 之前,我使用的是旧版本的 firebaseMessaging 没有问题,现在我有了最新版本。升级后出现以下错误

The class 'FirebaseMessaging' doesn't have a default constructor.


enter image description here

还有:

The method 'configure' isn't defined for the type 'FirebaseMessaging'.


enter image description here

全班:


class ShowNotifications {
static final FirebaseMessaging firebaseMessaging = FirebaseMessaging();
 static FlutterlocalnotificationsPlugin FlutterlocalnotificationsPlugin =
  new FlutterlocalnotificationsPlugin();

  static void initialization(){
    var initializationSettingsAndroid =
    new AndroidInitializationSettings('@mipmap/ic_launcher');
    var initializationSettingsIOS = new IOSInitializationSettings();
    var initializationSettings = new InitializationSettings(
        android: initializationSettingsAndroid,iOS: initializationSettingsIOS);

    FlutterlocalnotificationsPlugin = new FlutterlocalnotificationsPlugin();
    FlutterlocalnotificationsPlugin.initialize(initializationSettings,onSelectNotification: onSelectNotification);
  }




 static void showNotification(String title,String body) async {
    await _demoNotification(title,body);
  }

 static Future<void> _demoNotification(String title,String body) async {
    var androidplatformChannelSpecifics = AndroidNotificationDetails(
        'channel_ID','channel name','channel description',importance: Importance.max,playSound: true,// sound: 'sound',// sound: true,showProgress: true,priority: Priority.high,ticker: 'test ticker');

    var iOSChannelSpecifics = IOSNotificationDetails();
    var platformChannelSpecifics = NotificationDetails(
        android: androidplatformChannelSpecifics,iOS: iOSChannelSpecifics);
    await FlutterlocalnotificationsPlugin
        .show(0,title,body,platformChannelSpecifics,payload: 'test');
  }


 static Future onSelectNotification(String payload) async {
    showDialog(
   //   context: context,builder: (_) {
        return new AlertDialog(
          title: Text("PayLoad"),content: Text("Payload : $payload"),);
      },);
  }


 static notification(){
    firebaseMessaging.configure(
      onMessage: (Map<String,dynamic> message) async {
        showNotification(message['notification']['title'],message['notification']['body']);
        // print("onMessage: $message");
      },onLaunch: (Map<String,dynamic> message) async {
        print("onLaunch: $message");

      },onResume: (Map<String,dynamic> message) async {
        print("onResume: $message");

      },);
  }
}

我能够从所有应用程序页面控制这个类。

我需要用新版本改变什么。这样我就可以像过去一样使用课程了。

解决方法

尝试更新您的 firebase_messaging 软件包,并注意为其他 Firebase SDK 使用兼容的软件包。我建议您从官方 documentation 为您使用的每一个复制那些。

以下是新 Firebase Messaging SDK 如何与新 API 配合使用的完整示例:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:fluttertoast/fluttertoast.dart';

import '../constants.dart';

FirebaseMessaging messaging = FirebaseMessaging.instance;

final _database = FirebaseDatabase.instance;
final _firestore = FirebaseFirestore.instance;
final _auth = FirebaseAuth.instance;

class MessagingService {
  static bool showToast = true;
  static String currentToken;

  static void initialize() async {
    await messaging.requestPermission(
      alert: true,announcement: false,badge: true,carPlay: false,criticalAlert: false,provisional: false,sound: true,);

    FirebaseMessaging.onMessage.listen((RemoteMessage message) {
      if (message.notification != null) {
        print('Message also contained a notification: ${message.notification}');
      }

      if (showToast && message.notification != null) {
        Fluttertoast.showToast(
          msg: "${message.notification.title}: ${message.notification.body} ",toastLength: Toast.LENGTH_SHORT,gravity: ToastGravity.BOTTOM,timeInSecForIosWeb: 1,//backgroundColor: Colors.red,//textColor: Colors.white,fontSize: 16.0,);
      }
    });

    messaging.onTokenRefresh.listen((String token) async {
      await syncToken();
    });

    await syncToken();
  }

  static Future<String> getToken() async {
    String token = await messaging.getToken();
    return token;
  }

  static Future syncToken() async {
    try {
      String token = await messaging.getToken();
      if (token != currentToken) {
        if (syncDatabase == databases.RealtimeDatabase) {
          await _database
              .reference()
              .child(
                  '$kNotificationTokensSyncBasePath${_auth.currentUser.uid}/$token')
              .set(true);
        } else {
          await _firestore
              .doc('$kNotificationTokensSyncBasePath${_auth.currentUser.uid}')
              .set({'$token': true},SetOptions(merge: true));
        }

        currentToken = token;
      }
    } catch (e) {
      print(e);
    }

    return;
  }

  static Future unsyncToken(User user) async {
    try {
      String token = await messaging.getToken();

      if (syncDatabase == databases.RealtimeDatabase) {
        await _database
            .reference()
            .child('$kNotificationTokensSyncBasePath${user.uid}/$token')
            .set(null);
      } else {
        await _firestore
            .doc('$kNotificationTokensSyncBasePath${_auth.currentUser.uid}')
            .set({'$token': FieldValue.delete()},SetOptions(merge: true));
      }

      currentToken = null;
    } catch (e) {
      print(e);
    }

    return;
  }
}