Skip to content

Commit 4bae6f9

Browse files
Handle listeners for web markers
1 parent 97b24fd commit 4bae6f9

File tree

1 file changed

+60
-29
lines changed
  • packages/google_maps_flutter/google_maps_flutter_web/lib/src

1 file changed

+60
-29
lines changed

packages/google_maps_flutter/google_maps_flutter_web/lib/src/marker.dart

Lines changed: 60 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ abstract class MarkerController<T, O> {
2020
LatLngCallback? onDragEnd,
2121
VoidCallback? onTap,
2222
ClusterManagerId? clusterManagerId,
23-
}) : _marker = marker,
24-
_infoWindow = infoWindow,
25-
_consumeTapEvents = consumeTapEvents,
26-
_clusterManagerId = clusterManagerId {
23+
}) : _marker = marker,
24+
_infoWindow = infoWindow,
25+
_consumeTapEvents = consumeTapEvents,
26+
_clusterManagerId = clusterManagerId {
2727
addMarkerListener(
2828
marker: marker,
2929
onDragStart: onDragStart,
@@ -62,10 +62,7 @@ abstract class MarkerController<T, O> {
6262
/// Updates the options of the wrapped marker object.
6363
///
6464
/// This cannot be called after [remove].
65-
void update(
66-
O options, {
67-
web.HTMLElement? newInfoWindowContent,
68-
});
65+
void update(O options, {web.HTMLElement? newInfoWindowContent});
6966

7067
/// Initializes the listener for the wrapped marker object.
7168
void addMarkerListener({
@@ -114,6 +111,14 @@ class LegacyMarkerController
114111
super.clusterManagerId,
115112
});
116113

114+
/// List of active stream subscriptions for marker events.
115+
///
116+
/// This list keeps track of all event subscriptions created for the marker,
117+
/// including taps and different drag events.
118+
/// These subscriptions should be disposed when the controller is disposed.
119+
final List<StreamSubscription<dynamic>> _subscriptions =
120+
<StreamSubscription<dynamic>>[];
121+
117122
@override
118123
void addMarkerListener({
119124
required gmaps.Marker marker,
@@ -123,27 +128,29 @@ class LegacyMarkerController
123128
required VoidCallback? onTap,
124129
}) {
125130
if (onTap != null) {
126-
marker.onClick.listen((gmaps.MapMouseEvent event) {
127-
onTap.call();
128-
});
131+
_subscriptions.add(
132+
marker.onClick.listen((gmaps.MapMouseEvent event) {
133+
onTap.call();
134+
}),
135+
);
129136
}
130137
if (onDragStart != null) {
131-
marker.onDragstart.listen((gmaps.MapMouseEvent event) {
138+
_subscriptions.add(marker.onDragstart.listen((gmaps.MapMouseEvent event) {
132139
marker.position = event.latLng;
133140
onDragStart.call(event.latLng ?? _nullGmapsLatLng);
134-
});
141+
}));
135142
}
136143
if (onDrag != null) {
137-
marker.onDrag.listen((gmaps.MapMouseEvent event) {
144+
_subscriptions.add(marker.onDrag.listen((gmaps.MapMouseEvent event) {
138145
marker.position = event.latLng;
139146
onDrag.call(event.latLng ?? _nullGmapsLatLng);
140-
});
147+
}));
141148
}
142149
if (onDragEnd != null) {
143-
marker.onDragend.listen((gmaps.MapMouseEvent event) {
150+
_subscriptions.add(marker.onDragend.listen((gmaps.MapMouseEvent event) {
144151
marker.position = event.latLng;
145152
onDragEnd.call(event.latLng ?? _nullGmapsLatLng);
146-
});
153+
}));
147154
}
148155
}
149156

@@ -153,6 +160,11 @@ class LegacyMarkerController
153160
_infoWindowShown = false;
154161
_marker!.map = null;
155162
_marker = null;
163+
164+
for (final StreamSubscription<dynamic> sub in _subscriptions) {
165+
sub.cancel();
166+
}
167+
_subscriptions.clear();
156168
}
157169
}
158170

@@ -166,8 +178,10 @@ class LegacyMarkerController
166178
}
167179

168180
@override
169-
void update(gmaps.MarkerOptions options,
170-
{web.HTMLElement? newInfoWindowContent}) {
181+
void update(
182+
gmaps.MarkerOptions options, {
183+
web.HTMLElement? newInfoWindowContent,
184+
}) {
171185
assert(_marker != null, 'Cannot `update` Marker after calling `remove`.');
172186
_marker!.options = options;
173187

@@ -181,8 +195,12 @@ class LegacyMarkerController
181195
///
182196
/// [gmaps.AdvancedMarkerElement] is a new class that is
183197
/// replacing [gmaps.Marker].
184-
class AdvancedMarkerController extends MarkerController<
185-
gmaps.AdvancedMarkerElement, gmaps.AdvancedMarkerElementOptions> {
198+
class AdvancedMarkerController
199+
extends
200+
MarkerController<
201+
gmaps.AdvancedMarkerElement,
202+
gmaps.AdvancedMarkerElementOptions
203+
> {
186204
/// Creates a `AdvancedMarkerController`, which wraps
187205
/// a [gmaps.AdvancedMarkerElement] object.
188206
AdvancedMarkerController({
@@ -196,6 +214,14 @@ class AdvancedMarkerController extends MarkerController<
196214
super.clusterManagerId,
197215
});
198216

217+
/// List of active stream subscriptions for marker events.
218+
///
219+
/// This list keeps track of all event subscriptions created for the marker,
220+
/// including taps and different drag events.
221+
/// These subscriptions should be disposed when the controller is disposed.
222+
final List<StreamSubscription<dynamic>> _subscriptions =
223+
<StreamSubscription<dynamic>>[];
224+
199225
@override
200226
void addMarkerListener({
201227
required gmaps.AdvancedMarkerElement marker,
@@ -205,27 +231,27 @@ class AdvancedMarkerController extends MarkerController<
205231
required VoidCallback? onTap,
206232
}) {
207233
if (onTap != null) {
208-
marker.onClick.listen((gmaps.MapMouseEvent event) {
234+
_subscriptions.add(marker.onClick.listen((gmaps.MapMouseEvent event) {
209235
onTap.call();
210-
});
236+
}));
211237
}
212238
if (onDragStart != null) {
213-
marker.onDragstart.listen((gmaps.MapMouseEvent event) {
239+
_subscriptions.add(marker.onDragstart.listen((gmaps.MapMouseEvent event) {
214240
marker.position = event.latLng;
215241
onDragStart.call(event.latLng ?? _nullGmapsLatLng);
216-
});
242+
}));
217243
}
218244
if (onDrag != null) {
219-
marker.onDrag.listen((gmaps.MapMouseEvent event) {
245+
_subscriptions.add(marker.onDrag.listen((gmaps.MapMouseEvent event) {
220246
marker.position = event.latLng;
221247
onDrag.call(event.latLng ?? _nullGmapsLatLng);
222-
});
248+
}));
223249
}
224250
if (onDragEnd != null) {
225-
marker.onDragend.listen((gmaps.MapMouseEvent event) {
251+
_subscriptions.add(marker.onDragend.listen((gmaps.MapMouseEvent event) {
226252
marker.position = event.latLng;
227253
onDragEnd.call(event.latLng ?? _nullGmapsLatLng);
228-
});
254+
}));
229255
}
230256
}
231257

@@ -237,6 +263,11 @@ class AdvancedMarkerController extends MarkerController<
237263
_marker!.remove();
238264
_marker!.map = null;
239265
_marker = null;
266+
267+
for (final StreamSubscription<dynamic> sub in _subscriptions) {
268+
sub.cancel();
269+
}
270+
_subscriptions.clear();
240271
}
241272
}
242273

0 commit comments

Comments
 (0)