Skip to content

Commit 925c318

Browse files
committed
Correctly cancel subscription in database (#198)
Fixes #121
1 parent 5c45219 commit 925c318

3 files changed

Lines changed: 33 additions & 2 deletions

File tree

packages/firebase-dart/lib/src/database.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ class Query<T extends database_interop.QueryJsImpl> extends JsObjectWrapper<T> {
309309
}
310310

311311
void stopListen() {
312-
jsObject.off(eventType);
312+
jsObject.off(eventType, callbackWrap);
313313
}
314314

315315
streamController = new StreamController<QueryEvent>.broadcast(

packages/firebase-dart/lib/src/interop/database_interop.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,10 @@ abstract class QueryJsImpl {
6262
external bool isEqual(QueryJsImpl other);
6363
external QueryJsImpl limitToFirst(int limit);
6464
external QueryJsImpl limitToLast(int limit);
65-
external void off([String eventType, Func2Opt1 callback, context]);
65+
external void off(
66+
[String eventType,
67+
Func2Opt1<DataSnapshotJsImpl, String, Null> callback,
68+
context]);
6669
external Func0 on(
6770
String eventType, Func2Opt1<DataSnapshotJsImpl, String, Null> callback,
6871
[cancelCallbackOrContext, context]);

packages/firebase-dart/test/database_test.dart

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,34 @@ void main() {
135135
expect(val, "Cooking delicious dinner!");
136136
});
137137

138+
test("distinctListeners", () async {
139+
var sub1 = ref.onValue.listen(expectAsync1((event) {
140+
// print("first listener called.");
141+
}, count: 1));
142+
143+
addTearDown(sub1.cancel);
144+
145+
var sub2 = ref.onValue.listen(expectAsync1((event) {
146+
// print("second listener called.");
147+
}, count: 0));
148+
149+
await sub2.cancel().then((_) => print("second listener cancelled."));
150+
151+
var anotherRef = database.ref("test");
152+
var sub3 = anotherRef.onValue.listen(expectAsync1((event) {
153+
// print("third listener called.");
154+
}, count: 1));
155+
156+
addTearDown(sub3.cancel);
157+
158+
var yetAnotherRef = database.ref("test");
159+
var sub4 = yetAnotherRef.onValue.listen(expectAsync1((event) {
160+
// print("fourth listener called.");
161+
}, count: 0));
162+
163+
await sub4.cancel().then((_) => print("fourth listener cancelled."));
164+
});
165+
138166
test("onValue", () async {
139167
var childRef = ref.child("todos");
140168
// ignore: unawaited_futures

0 commit comments

Comments
 (0)