繁体   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