diff --git a/packages/firebase_database/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FirebaseDatabasePlugin.java b/packages/firebase_database/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FirebaseDatabasePlugin.java index f77c75cda874..bdfd6af2e621 100644 --- a/packages/firebase_database/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FirebaseDatabasePlugin.java +++ b/packages/firebase_database/firebase_database/android/src/main/java/io/flutter/plugins/firebase/database/FirebaseDatabasePlugin.java @@ -36,7 +36,7 @@ public class FirebaseDatabasePlugin implements FlutterFirebasePlugin, FlutterPlugin, MethodCallHandler { protected static final HashMap databaseInstanceCache = new HashMap<>(); private static final String METHOD_CHANNEL_NAME = "plugins.flutter.io/firebase_database"; - private final Map queryListenersCount = new HashMap<>(); + private int listenerCount = 0; private final Map streamHandlers = new HashMap<>(); private MethodChannel methodChannel; private BinaryMessenger messenger; @@ -272,28 +272,14 @@ private Task observe(Map arguments) { final Query query = getQuery(arguments); final String eventChannelNamePrefix = (String) arguments.get(Constants.EVENT_CHANNEL_NAME_PREFIX); + final String eventChannelName = eventChannelNamePrefix + "#" + listenerCount++; - int newListenersCount; - synchronized (queryListenersCount) { - Integer currentListenersCount = queryListenersCount.get(eventChannelNamePrefix); - newListenersCount = currentListenersCount == null ? 1 : currentListenersCount + 1; - queryListenersCount.put(eventChannelNamePrefix, newListenersCount); - } - - final String eventChannelName = eventChannelNamePrefix + "#" + newListenersCount; final EventChannel eventChannel = new EventChannel(messenger, eventChannelName); final EventStreamHandler streamHandler = new EventStreamHandler( query, () -> { eventChannel.setStreamHandler(null); - synchronized (queryListenersCount) { - Integer currentListenersCount = - queryListenersCount.get(eventChannelNamePrefix); - queryListenersCount.put( - eventChannelNamePrefix, - currentListenersCount == null ? 0 : currentListenersCount - 1); - } }); eventChannel.setStreamHandler(streamHandler); @@ -476,9 +462,6 @@ public Task didReinitializeFirebaseCore() { private void cleanup() { removeEventStreamHandlers(); - synchronized (queryListenersCount) { - queryListenersCount.clear(); - } databaseInstanceCache.clear(); } diff --git a/packages/firebase_database/firebase_database/ios/Classes/FLTFirebaseDatabasePlugin.m b/packages/firebase_database/firebase_database/ios/Classes/FLTFirebaseDatabasePlugin.m index e7c1ea5e1a2f..46fab907925f 100644 --- a/packages/firebase_database/firebase_database/ios/Classes/FLTFirebaseDatabasePlugin.m +++ b/packages/firebase_database/firebase_database/ios/Classes/FLTFirebaseDatabasePlugin.m @@ -13,10 +13,10 @@ @implementation FLTFirebaseDatabasePlugin { // Used by FlutterStreamHandlers. NSObject *_binaryMessenger; - NSMutableDictionary *_listenerCounts; NSMutableDictionary *_streamHandlers; // Used by transactions. FlutterMethodChannel *_channel; + int _listenerCount; } #pragma mark - FlutterPlugin @@ -27,8 +27,8 @@ - (instancetype)init:(NSObject *)messenger if (self) { _channel = channel; _binaryMessenger = messenger; - _listenerCounts = [NSMutableDictionary dictionary]; _streamHandlers = [NSMutableDictionary dictionary]; + _listenerCount = 0; } return self; } @@ -355,31 +355,17 @@ - (void)queryKeepSynced:(id)arguments withMethodCallResult:(FLTFirebaseMethodCal - (void)queryObserve:(id)arguments withMethodCallResult:(FLTFirebaseMethodCallResult *)result { FIRDatabaseQuery *databaseQuery = [FLTFirebaseDatabaseUtils databaseQueryFromArguments:arguments]; NSString *eventChannelNamePrefix = arguments[@"eventChannelNamePrefix"]; - int newListenersCount; - @synchronized(_listenerCounts) { - NSNumber *currentListenersCount = _listenerCounts[eventChannelNamePrefix]; - newListenersCount = currentListenersCount == nil ? 1 : [currentListenersCount intValue] + 1; - _listenerCounts[eventChannelNamePrefix] = @(newListenersCount); - } + _listenerCount = _listenerCount + 1; NSString *eventChannelName = - [NSString stringWithFormat:@"%@#%d", eventChannelNamePrefix, newListenersCount]; + [NSString stringWithFormat:@"%@#%i", eventChannelNamePrefix, _listenerCount]; FlutterEventChannel *eventChannel = [FlutterEventChannel eventChannelWithName:eventChannelName binaryMessenger:_binaryMessenger]; - __weak FLTFirebaseDatabasePlugin *weakSelf = self; FLTFirebaseDatabaseObserveStreamHandler *streamHandler = - [[FLTFirebaseDatabaseObserveStreamHandler alloc] - initWithFIRDatabaseQuery:databaseQuery - andOnDisposeBlock:^() { - __strong FLTFirebaseDatabasePlugin *strongSelf = weakSelf; - [eventChannel setStreamHandler:nil]; - @synchronized(strongSelf->_listenerCounts) { - NSNumber *currentListenersCount = - strongSelf->_listenerCounts[eventChannelNamePrefix]; - strongSelf->_listenerCounts[eventChannelNamePrefix] = - @(currentListenersCount == nil ? 0 : [currentListenersCount intValue] - 1); - } - }]; + [[FLTFirebaseDatabaseObserveStreamHandler alloc] initWithFIRDatabaseQuery:databaseQuery + andOnDisposeBlock:^() { + [eventChannel setStreamHandler:nil]; + }]; [eventChannel setStreamHandler:streamHandler]; _streamHandlers[eventChannelName] = streamHandler; result.success(eventChannelName);