Flutter FirebaseMessaging - StreamSubscription 处理不当

Flutter FirebaseMessaging - StreamSubscription not handled properly

我有以下基本示例,它似乎无法正常工作:

pubspec.yaml:

firebase_messaging: ^10.0.0

FcmService.dart

StreamSubscription fcmListener;

void init() {
   fcmListener = FirebaseMessaging.onMessage.listen((RemoteMessage message) {
     // do stuff
   });
}

void dispose() {
   print('SUBSCRIPTION canceled');
   fcmListener.cancel()
}

App.dart

void init() {
   fcmService.init();
   // other inits()
}

void dispose() {
   print('EVERYTHING disposed');
   fcmService.dispose();
   // other disposes()
}

问题

在我登录到我的应用程序后,App.dart 的 init() 方法被调用,一切都已正确设置。 FCM 服务工作正常。当我注销应用程序时,App.dart 的 dispose() 方法被调用,应用程序重定向到 Login.dart。正确的日志是 EVERYTHING disposedSUBSCRIPTION canceled.

但是,如果我再次登录(没有热重新加载应用程序),我会收到以下关于 fcmListener = FirebaseMessaging.onMessage.listen()

的错误消息

Unhandled Exception: Bad state: Cannot add new events while doing an addStream。尽管如此,FCMService 仍然按预期工作。

这只发生在他们不久前重写的新 firebase_messaging 中。我在 firebase_messaging 的早期版本中使用了相同的代码,但没有出现此异常。

我是不是漏掉了什么?

尝试在 FirebaseMessaging.onMessage 之后调用 .asBroadcastStream():

void init() {
  fcmListener = FirebaseMessaging
    .onMessage
    .asBroadcastStream()
    .listen((RemoteMessage message) {
      // do stuff
    });
}

应使用 FirebaseMessaging.onMessageOpenedApp 调用相同的方法。我在 GitHub issue.

中找到了这个解决方案

您可以在 firebase 云消息传递中使用订阅和主题功能。这是另一种简单的方法。

Login
FirebaseMessaging.instance.unsubscribeFromTopic("guest");
FirebaseMessaging.instance.subscribeToTopic("loggedIn");

Logout
FirebaseMessaging.instance.subscribeToTopic("guest");
FirebaseMessaging.instance.unsubscribeFromTopic("loggedIn");

FCM Api = 
{
 "to" : "/topics/loggedin",
 "notification" : {
     "title" : "your title notification",
     "body" : "your body notification"
 }
}