Skip to content

Commit c853830

Browse files
committed
Stop sending map events once stream controller is closed
1 parent 7814fab commit c853830

File tree

2 files changed

+62
-12
lines changed

2 files changed

+62
-12
lines changed

packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_controller_test.dart

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,44 @@ void main() {
307307
expect(events[4], isA<CameraIdleEvent>());
308308
});
309309

310+
testWidgets('stops listening to map events once disposed',
311+
(WidgetTester tester) async {
312+
controller = createController()
313+
..debugSetOverrides(
314+
createMap: (_, __) => map,
315+
circles: circles,
316+
heatmaps: heatmaps,
317+
markers: markers,
318+
polygons: polygons,
319+
polylines: polylines,
320+
groundOverlays: groundOverlays,
321+
)
322+
..init();
323+
324+
controller.dispose();
325+
326+
// Trigger events on the map, and verify they've been broadcast to the stream
327+
final Stream<MapEvent<Object?>> capturedEvents = stream.stream.take(5);
328+
329+
gmaps.event.trigger(
330+
map,
331+
'click',
332+
gmaps.MapMouseEvent()..latLng = gmaps.LatLng(0, 0),
333+
);
334+
gmaps.event.trigger(
335+
map,
336+
'rightclick',
337+
gmaps.MapMouseEvent()..latLng = gmaps.LatLng(0, 0),
338+
);
339+
// The following line causes 2 events
340+
gmaps.event.trigger(map, 'bounds_changed');
341+
gmaps.event.trigger(map, 'idle');
342+
343+
final List<MapEvent<Object?>> events = await capturedEvents.toList();
344+
345+
expect(events, isEmpty);
346+
});
347+
310348
testWidgets("binds geometry controllers to map's",
311349
(WidgetTester tester) async {
312350
controller = createController()

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

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -243,32 +243,44 @@ class GoogleMapController {
243243
void _attachMapEvents(gmaps.Map map) {
244244
map.onTilesloaded.first.then((void _) {
245245
// Report the map as ready to go the first time the tiles load
246-
_streamController.add(WebMapReadyEvent(_mapId));
246+
if (!_streamController.isClosed) {
247+
_streamController.add(WebMapReadyEvent(_mapId));
248+
}
247249
});
248250
map.onClick.listen((gmaps.MapMouseEventOrIconMouseEvent event) {
249251
assert(event.latLng != null);
250-
_streamController.add(
251-
MapTapEvent(_mapId, gmLatLngToLatLng(event.latLng!)),
252-
);
252+
if (!_streamController.isClosed) {
253+
_streamController.add(
254+
MapTapEvent(_mapId, gmLatLngToLatLng(event.latLng!)),
255+
);
256+
}
253257
});
254258
map.onRightclick.listen((gmaps.MapMouseEvent event) {
255259
assert(event.latLng != null);
256-
_streamController.add(
257-
MapLongPressEvent(_mapId, gmLatLngToLatLng(event.latLng!)),
258-
);
260+
if (!_streamController.isClosed) {
261+
_streamController.add(
262+
MapLongPressEvent(_mapId, gmLatLngToLatLng(event.latLng!)),
263+
);
264+
}
259265
});
260266
map.onBoundsChanged.listen((void _) {
261267
if (!_mapIsMoving) {
262268
_mapIsMoving = true;
263-
_streamController.add(CameraMoveStartedEvent(_mapId));
269+
if (!_streamController.isClosed) {
270+
_streamController.add(CameraMoveStartedEvent(_mapId));
271+
}
272+
}
273+
if (!_streamController.isClosed) {
274+
_streamController.add(
275+
CameraMoveEvent(_mapId, _gmViewportToCameraPosition(map)),
276+
);
264277
}
265-
_streamController.add(
266-
CameraMoveEvent(_mapId, _gmViewportToCameraPosition(map)),
267-
);
268278
});
269279
map.onIdle.listen((void _) {
270280
_mapIsMoving = false;
271-
_streamController.add(CameraIdleEvent(_mapId));
281+
if (!_streamController.isClosed) {
282+
_streamController.add(CameraIdleEvent(_mapId));
283+
}
272284
});
273285
}
274286

0 commit comments

Comments
 (0)