Skip to content

Commit 6499c5f

Browse files
authored
fix(storage, android): fix an issue that could crash the app when concurrent calls to removeEventListeners were happening (#16996)
1 parent b4e46db commit 6499c5f

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseStoragePlugin.java

+17-7
Original file line numberDiff line numberDiff line change
@@ -156,16 +156,26 @@ private String registerEventChannel(String prefix, String identifier, StreamHand
156156
return identifier;
157157
}
158158

159-
private void removeEventListeners() {
160-
for (String identifier : eventChannels.keySet()) {
161-
eventChannels.get(identifier).setStreamHandler(null);
159+
private synchronized void removeEventListeners() {
160+
// Create a list to hold the keys to remove after iteration
161+
List<String> eventChannelKeys = new ArrayList<>(eventChannels.keySet());
162+
for (String identifier : eventChannelKeys) {
163+
EventChannel eventChannel = eventChannels.get(identifier);
164+
if (eventChannel != null) {
165+
eventChannel.setStreamHandler(null);
166+
}
167+
eventChannels.remove(identifier);
162168
}
163-
eventChannels.clear();
164169

165-
for (String identifier : streamHandlers.keySet()) {
166-
streamHandlers.get(identifier).onCancel(null);
170+
// Create a list to hold the keys to remove after iteration
171+
List<String> streamHandlerKeys = new ArrayList<>(streamHandlers.keySet());
172+
for (String identifier : streamHandlerKeys) {
173+
StreamHandler streamHandler = streamHandlers.get(identifier);
174+
if (streamHandler != null) {
175+
streamHandler.onCancel(null);
176+
}
177+
streamHandlers.remove(identifier);
167178
}
168-
streamHandlers.clear();
169179
}
170180

171181
private FirebaseStorage getStorageFromPigeon(

0 commit comments

Comments
 (0)