diff --git a/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md index e4918ab1d5ca..9307affdf945 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.0+6 + +* Ensure a single `InfoWindow` is shown at a time. [Issue](https://github.com/flutter/flutter/issues/67380). + ## 0.1.0+5 * Update `package:google_maps` to `^3.4.5`. diff --git a/packages/google_maps_flutter/google_maps_flutter_web/lib/src/markers.dart b/packages/google_maps_flutter/google_maps_flutter_web/lib/src/markers.dart index a0428adcdc2e..fea6164515b8 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/lib/src/markers.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/lib/src/markers.dart @@ -105,6 +105,7 @@ class MarkersController extends GeometryController { /// /// See also [hideMarkerInfoWindow] and [isInfoWindowShown]. void showMarkerInfoWindow(MarkerId markerId) { + _hideAllMarkerInfoWindow(); MarkerController markerController = _markerIdToController[markerId]; markerController?.showInfoWindow(); } @@ -145,4 +146,11 @@ class MarkersController extends GeometryController { markerId, )); } + + void _hideAllMarkerInfoWindow() { + _markerIdToController.values + .where((controller) => + controller == null ? false : controller.infoWindowShown) + .forEach((controller) => controller.hideInfoWindow()); + } } diff --git a/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml index a44d5c185c1f..9f88ff16ea4c 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml @@ -1,7 +1,7 @@ name: google_maps_flutter_web description: Web platform implementation of google_maps_flutter homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter -version: 0.1.0+5 +version: 0.1.0+6 flutter: plugin: diff --git a/packages/google_maps_flutter/google_maps_flutter_web/test/test_driver/markers_integration.dart b/packages/google_maps_flutter/google_maps_flutter_web/test/test_driver/markers_integration.dart index a813ff86188e..cad8cd8acfed 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/test/test_driver/markers_integration.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/test/test_driver/markers_integration.dart @@ -100,6 +100,35 @@ void main() { expect(controller.markers[MarkerId('1')].infoWindowShown, isFalse); }); + // https://github.com/flutter/flutter/issues/67380 + testWidgets('only single InfoWindow is visible', + (WidgetTester tester) async { + final markers = { + Marker( + markerId: MarkerId('1'), + infoWindow: InfoWindow(title: "Title", snippet: "Snippet"), + ), + Marker( + markerId: MarkerId('2'), + infoWindow: InfoWindow(title: "Title", snippet: "Snippet"), + ), + }; + controller.addMarkers(markers); + + expect(controller.markers[MarkerId('1')].infoWindowShown, isFalse); + expect(controller.markers[MarkerId('2')].infoWindowShown, isFalse); + + controller.showMarkerInfoWindow(MarkerId('1')); + + expect(controller.markers[MarkerId('1')].infoWindowShown, isTrue); + expect(controller.markers[MarkerId('2')].infoWindowShown, isFalse); + + controller.showMarkerInfoWindow(MarkerId('2')); + + expect(controller.markers[MarkerId('1')].infoWindowShown, isFalse); + expect(controller.markers[MarkerId('2')].infoWindowShown, isTrue); + }); + // https://github.com/flutter/flutter/issues/64938 testWidgets('markers with icon:null work', (WidgetTester tester) async { final markers = {