簡體   English   中英

Firebase Flutter firebase 消息的升級問題

[英]Firebase Flutter upgrade problem for firebase messaging

我已將 firebase 從^7.0.0升級到^8.0.0-dev.15 ,現在出現錯誤,我不確定如何修復。

這是我的遺留工作代碼:

void initFirebase() {
    _firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async {
        print("onMessage: $message");
      },
      onLaunch: (Map<String, dynamic> message) async {
        print("onLaunch: $message");
      },
      onResume: (Map<String, dynamic> message) async {
        print("onResume: $message");
      },
    );
    _firebaseMessaging.requestNotificationPermissions(
        const IosNotificationSettings(
            sound: true, badge: true, alert: true, provisional: true));
    _firebaseMessaging.onIosSettingsRegistered
        .listen((IosNotificationSettings settings) {});
    _firebaseMessaging.getToken().then((String token) {
      assert(token != null);
      setState(() {
        _notificationToken = token;
      });
    });
  }

我收到以下錯誤:

lib/files/signin.dart:52:7: Error: No named parameter with the name 'onLaunch'.
      onLaunch: (Map<String, dynamic> message) async {
      ^^^^^^^^
lib/files/signin.dart:62:24: Error: The getter 'onIosSettingsRegistered' isn't defined for the class 'FirebaseMessaging'.
 - 'FirebaseMessaging' is from 'package:firebase_messaging/firebase_messaging.dart' ('/C:/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_messaging-8.0.0-dev.15/lib/firebase_messaging.dart').
Try correcting the name to the name of an existing getter, or defining a getter or field named 'onIosSettingsRegistered'.
    _firebaseMessaging.onIosSettingsRegistered
                       ^^^^^^^^^^^^^^^^^^^^^^^

現在,我開始按照官方文檔修復代碼,但無法完全正確,感謝您的幫助:

  void initFirebase() {
    FirebaseMessaging.onMessage.listen(
      (RemoteMessage message) {
        print("onMessage: $message");
      });
      FirebaseMessaging.onMessageOpenedApp.listen(
      (RemoteMessage message) {
        print("onMessageOpenedApp: $message");
      });
    
    NotificationSettings settings = messaging.requestPermission (
        sound: true, badge: true, alert: true, provisional: true,
    );
    _firebaseMessaging.onIosSettingsRegistered
        .listen((IosNotificationSettings settings) {});
    _firebaseMessaging.getToken().then((String token) {
      assert(token != null);
      setState(() {
        _notificationToken = token;
      });
    });
  }

如果您使用的是 firebase_messaging: ^8.0.0-dev.15 ,您還應該添加 firebase_core firebase_core:^0.7.0 而且沒有“OnResume”、“onLaunch”、“onMessage”,還有其他選擇。 這是在此答案中提到的這種情況下如何使用它。 更多可以查看官方文檔

對不起,我之前回答了另一個問題。 此外,我使用 flutter 和 firebase 的另一個主要版本。

所以我刪除了我的答案並在這里打開了一個新帖子: Flutter 2.0 with Firebase Cloud Messaging: onMessage not called on Android

- 編輯

這個錯誤與您的問題有關嗎? https://github.com/FirebaseExtended/flutterfire/issues/4054

問候,

烏韋

此舊版升級有一些重大更改。 我重現了你的問題。 onresume、onlaunch 等概念已被重新分類為前台消息和后台消息。

為了處理后台消息,在頂級 class 像你一樣 main.dart 文件,實例化 firebase 消息。

Future<void>main() async{
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
  runApp(MyApp());

}

在這種情況下創建一個方法 (_firebaseMessagingBackgroundHandler)。 (如果您要在后台使用其他 Firebase 服務,例如 Firestore,請不要忘記在使用其他 Firebase 服務之前調用initializeApp 。)。

背景

Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp();
  print("Handling a background message: ${message.messageId}");
  print(message.data);
}

前台通知略有不同。 默認情況下,它們不會在屏幕上彈出。 您可以使用以下方法訪問前台通知


FirebaseMessaging.onMessage.listen((RemoteMessage message) {
  print("Handling a foreground message ${message.notification.body}");
RemoteNotification notification = message.notification;
  AndroidNotification android = message.notification?.android;

  if (notification != null && android != null) {
    flutterLocalNotificationsPlugin.show(
        notification.hashCode,
        notification.title,
        notification.body,
        NotificationDetails(
          android: AndroidNotificationDetails(
            channel.id,
            channel.name,
            channel.description,
            icon: android?.smallIcon,
            // other properties...
          ),
        ));
  }
});

您可以使用 JSON 格式來訪問消息。

onLaunch: 和 onResume:

FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
  print("app launched or resumed!!");
});

上面的兩個代碼將分別顯示通知。 后台處理程序還涵蓋終止應用程序的場景。

FirebaseMessaging.onMessageOpenedApp 返回一個 [Stream],當用戶按下通過 FCM 顯示的通知時會調用它。

PS:在使用像 PostMan 這樣的非 Google 服務器時,另一個重大變化是需要 Oauth-2 Bearer 令牌(短暫的,可以從https://developers.google.com/oauthplayground獲得服務帳戶.

關於您的問題-->錯誤:沒有名為“onLaunch”的命名參數。 onLaunch: (Map<String, dynamic> message) async { ^^^^^^^^. 您需要做的是在 _firebaseMessaging.configure(); 處替換您的代碼; 此代碼的一部分:

FirebaseMessaging.onMessage.listen(
   (RemoteMessage message) async {
      print('onMessage: $message');
      _setMessage(message.data);
   },
);
FirebaseMessaging.onMessage.listen(
      (RemoteMessage message) async {
    print('onLaunch: $message');
    _setMessage(message.data);
  },
);
FirebaseMessaging.onMessage.listen(
      (RemoteMessage message) async {
    print('onResume: $message');
    _setMessage(message.data);
  },
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM