Flutter:如何在Flutter中订阅Firebase(FCM)注册令牌的ToTopic



我想订阅flutter中Firebase推送通知的ToTopic,我可以订阅任何主题,但我的目的是根据令牌订阅ToTopic。这里是下面的代码,

FirebaseMessaging _messaging;
Firebase.initializeApp().then((fbr) {
_messaging = FirebaseMessaging.instance;
_messaging.getToken().then((token) async{
_messaging.subscribeToTopic(token).then((value) => null);
_messaging.subscribeToTopic(userID).then((value) => null);
_messaging.subscribeToTopic(userTypeId).then((value) => null);
}
}

但我收到错误

失败的断言:第307行位置10:"isValidTopic":不为true。

日志附在下面:

I/flutter ( 9352): Token: dhCABsvbQ8udQJha8VOxNy:APA91bEGcpS6-QMn-c236ITNbDtxEs3MD1Q-nquedMLzZv4XWPdGUWt-Zw-OQ6YBY383IJGZXxKXNMRJd8SKLeOO7agx4dcym6VoEhPTrbYr20NoscZHTZoPCf5mqbfiTHCS5q2WlXqw
I/flutter ( 9352): User granted permission
I/flutter ( 9352): Token: dhCABsvbQ8udQJha8VOxNy:APA91bEGcpS6-QMn-c236ITNbDtxEs3MD1Q-nquedMLzZv4XWPdGUWt-Zw-OQ6YBY383IJGZXxKXNMRJd8SKLeOO7agx4dcym6VoEhPTrbYr20NoscZHTZoPCf5mqbfiTHCS5q2WlXqw
E/flutter ( 9352): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: 'package:firebase_messaging/src/messaging.dart': Failed assertion: line 307 pos 10: 'isValidTopic': is not true.
E/flutter ( 9352): #0      _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:46:39)
E/flutter ( 9352): #1      _AssertionError._throwNew (dart:core-patch/errors_patch.dart:36:5)
E/flutter ( 9352): #2      _assertTopicName (package:firebase_messaging/src/messaging.dart:307:10)
E/flutter ( 9352): #3      FirebaseMessaging.subscribeToTopic (package:firebase_messaging/src/messaging.dart:294:5)
E/flutter ( 9352): #4      _HomePageState.registerNotification.<anonymous closure> (package:notify/main.dart:89:20)
E/flutter ( 9352): #5      _rootRunUnary (dart:async/zone.dart:1362:47)
E/flutter ( 9352): #6      _CustomZone.runUnary (dart:async/zone.dart:1265:19)
E/flutter ( 9352): #7      _FutureListener.handleValue (dart:async/future_impl.dart:152:18)
E/flutter ( 9352): #8      Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:704:45)
E/flutter ( 9352): #9      Future._propagateToListeners (dart:async/future_impl.dart:733:32)
E/flutter ( 9352): #10     Future._completeWithValue (dart:async/future_impl.dart:539:5)
E/flutter ( 9352): #11     _completeOnAsyncReturn (dart:async-patch/async_patch.dart:254:13)
E/flutter ( 9352): #12     MethodChannelFirebaseMessaging.getToken (package:firebase_messaging_platform_interface/src/method_channel/method_channel_messaging.dart)
E/flutter ( 9352): <asynchronous suspension>

出现错误是因为作为主题名称传递的令牌id不是可接受的主题名称。

以下是令牌失败的检查:

// https://github.com/FirebaseExtended/flutterfire/blob/master/packages/firebase_messaging/firebase_messaging/lib/src/messaging.dart
void _assertTopicName(String topic) {
bool isValidTopic = RegExp(r'^[a-zA-Z0-9-_.~%]{1,900}$').hasMatch(topic);
assert(isValidTopic);
}

使用有效的字符串,代码应该可以正常工作。

最新更新