@@ -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