@@ -53,18 +53,37 @@ class MethodCallHandlerImpl implements MethodChannel.MethodCallHandler {
53
53
this .channel = channel ;
54
54
}
55
55
56
+ void cleanup () {
57
+ final int size = observers .size ();
58
+ for (int i = 0 ; i < size ; i ++) {
59
+ final EventObserver observer = observers .valueAt (i );
60
+ final Query query = observer .query ;
61
+ if (observer .requestedEventType .equals (EVENT_TYPE_VALUE )) {
62
+ query .removeEventListener ((ValueEventListener ) observer );
63
+ } else {
64
+ query .removeEventListener ((ChildEventListener ) observer );
65
+ }
66
+ }
67
+
68
+ observers .clear ();
69
+ }
70
+
56
71
private DatabaseReference getReference (FirebaseDatabase database , Map <String , Object > arguments ) {
57
72
String path = (String ) arguments .get ("path" );
58
73
DatabaseReference reference = database .getReference ();
59
- if (path != null ) reference = reference .child (path );
74
+ if (path != null ) {
75
+ reference = reference .child (path );
76
+ }
60
77
return reference ;
61
78
}
62
79
63
80
private Query getQuery (FirebaseDatabase database , Map <String , Object > arguments ) {
64
81
Query query = getReference (database , arguments );
65
82
@ SuppressWarnings ("unchecked" )
66
83
Map <String , Object > parameters = (Map <String , Object >) arguments .get ("parameters" );
67
- if (parameters == null ) return query ;
84
+ if (parameters == null ) {
85
+ return query ;
86
+ }
68
87
Object orderBy = parameters .get ("orderBy" );
69
88
if ("child" .equals (orderBy )) {
70
89
query = query .orderByChild ((String ) parameters .get ("orderByChildKey" ));
@@ -148,6 +167,7 @@ private Query getQuery(FirebaseDatabase database, Map<String, Object> arguments)
148
167
}
149
168
150
169
private class DefaultCompletionListener implements DatabaseReference .CompletionListener {
170
+
151
171
private final MethodChannel .Result result ;
152
172
153
173
DefaultCompletionListener (MethodChannel .Result result ) {
@@ -164,12 +184,17 @@ public void onComplete(@Nullable DatabaseError error, @NonNull DatabaseReference
164
184
}
165
185
}
166
186
167
- private class EventObserver implements ChildEventListener , ValueEventListener {
187
+ private static class EventObserver implements ChildEventListener , ValueEventListener {
188
+
189
+ private MethodChannel channel ;
168
190
private String requestedEventType ;
191
+ private Query query ;
169
192
private int handle ;
170
193
171
- EventObserver (String requestedEventType , int handle ) {
194
+ EventObserver (MethodChannel channel , String requestedEventType , Query query , int handle ) {
195
+ this .channel = channel ;
172
196
this .requestedEventType = requestedEventType ;
197
+ this .query = query ;
173
198
this .handle = handle ;
174
199
}
175
200
@@ -249,6 +274,7 @@ public void onMethodCall(final MethodCall call, @NonNull final MethodChannel.Res
249
274
} else {
250
275
database = FirebaseDatabase .getInstance ();
251
276
}
277
+
252
278
switch (call .method ) {
253
279
case "FirebaseDatabase#goOnline" :
254
280
{
@@ -347,7 +373,8 @@ public void onMethodCall(final MethodCall call, @NonNull final MethodChannel.Res
347
373
@ NonNull
348
374
@ Override
349
375
public Transaction .Result doTransaction (@ NonNull MutableData mutableData ) {
350
- // Tasks are used to allow native execution of doTransaction to wait while Snapshot is
376
+ // Tasks are used to allow native execution of doTransaction to wait while
377
+ // Snapshot is
351
378
// processed by logic on the Dart side.
352
379
final TaskCompletionSource <Map <String , Object >> updateMutableDataTCS =
353
380
new TaskCompletionSource <>();
@@ -514,24 +541,25 @@ public void run() {
514
541
{
515
542
String eventType = call .argument ("eventType" );
516
543
int handle = nextHandle ++;
544
+ Query query = getQuery (database , arguments );
517
545
MethodCallHandlerImpl .EventObserver observer =
518
- new MethodCallHandlerImpl .EventObserver (eventType , handle );
546
+ new MethodCallHandlerImpl .EventObserver (channel , eventType , query , handle );
519
547
observers .put (handle , observer );
520
548
if (EVENT_TYPE_VALUE .equals (eventType )) {
521
- getQuery ( database , arguments ) .addValueEventListener (observer );
549
+ query .addValueEventListener (observer );
522
550
} else {
523
- getQuery ( database , arguments ) .addChildEventListener (observer );
551
+ query .addChildEventListener (observer );
524
552
}
525
553
result .success (handle );
526
554
break ;
527
555
}
528
556
529
557
case "Query#removeObserver" :
530
558
{
531
- Query query = getQuery (database , arguments );
532
559
Integer handle = call .argument ("handle" );
533
560
MethodCallHandlerImpl .EventObserver observer = observers .get (handle );
534
561
if (observer != null ) {
562
+ final Query query = observer .query ;
535
563
if (observer .requestedEventType .equals (EVENT_TYPE_VALUE )) {
536
564
query .removeEventListener ((ValueEventListener ) observer );
537
565
} else {
0 commit comments