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 disposed
和 SUBSCRIPTION 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"
}
}
我有以下基本示例,它似乎无法正常工作:
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 disposed
和 SUBSCRIPTION 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"
}
}