[google_maps_flutter_web] Show one InfoWindow at a time. (#3224)
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 e4918ab..9307aff 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 a0428ad..fea6164 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 @@
///
/// See also [hideMarkerInfoWindow] and [isInfoWindowShown].
void showMarkerInfoWindow(MarkerId markerId) {
+ _hideAllMarkerInfoWindow();
MarkerController markerController = _markerIdToController[markerId];
markerController?.showInfoWindow();
}
@@ -145,4 +146,11 @@
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 a44d5c1..9f88ff1 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 a813ff8..cad8cd8 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 @@
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 = {