diff --git a/packages/cloud_firestore/cloud_firestore/android/src/main/java/io/flutter/plugins/firebase/firestore/FlutterFirebaseFirestorePlugin.java b/packages/cloud_firestore/cloud_firestore/android/src/main/java/io/flutter/plugins/firebase/firestore/FlutterFirebaseFirestorePlugin.java index 02e2ccf5ffa0..4b65130f62a4 100644 --- a/packages/cloud_firestore/cloud_firestore/android/src/main/java/io/flutter/plugins/firebase/firestore/FlutterFirebaseFirestorePlugin.java +++ b/packages/cloud_firestore/cloud_firestore/android/src/main/java/io/flutter/plugins/firebase/firestore/FlutterFirebaseFirestorePlugin.java @@ -207,15 +207,17 @@ public Task didReinitializeFirebaseCore() { () -> { try { // Context is ignored by API so we don't send it over even though annotated non-null. + List firestoresToTerminate; synchronized (firestoreInstanceCache) { - for (Map.Entry entry : - firestoreInstanceCache.entrySet()) { - FirebaseFirestore firestore = entry.getKey(); + // Collect all firestore instances first to avoid ConcurrentModificationException + firestoresToTerminate = new ArrayList<>(firestoreInstanceCache.keySet()); + for (FirebaseFirestore firestore : firestoresToTerminate) { Tasks.await(firestore.terminate()); FlutterFirebaseFirestorePlugin.destroyCachedFirebaseFirestoreInstanceForKey( firestore); } } + removeEventListeners(); taskCompletionSource.setResult(null);