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 adc4d66e9eca..c9dd30f3c423 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.6.3+1 + +* Fixes AdvancedMarker anchor handling. + ## 0.6.3 * Adds support for mapTypeControlEnabled, fullscreenControlEnabled, and streetViewControlEnabled. diff --git a/packages/google_maps_flutter/google_maps_flutter_web/example/latest/integration_test/advanced_markers_test.dart b/packages/google_maps_flutter/google_maps_flutter_web/example/latest/integration_test/advanced_markers_test.dart index c3868cd5ac6d..13785f06cb8a 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/example/latest/integration_test/advanced_markers_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/example/latest/integration_test/advanced_markers_test.dart @@ -377,6 +377,32 @@ void main() { expect(icon.style.height, '30px'); }); + testWidgets('markers with anchor work', (WidgetTester tester) async { + const markerId = MarkerId('1'); + const anchorOffset = Offset(0.14, 0.75); + const updatedAnchorOffset = Offset(-0.6, 1.6); + + final markers = {AdvancedMarker(markerId: markerId, anchor: anchorOffset)}; + + await controller.addMarkers(markers); + + gmaps.AdvancedMarkerElement? marker = controller.markers[markerId]?.marker; + expect(marker, isNotNull); + expect(marker!.anchorLeft, '-14%'); + expect(marker.anchorTop, '-75%'); + + final updatedMarkers = { + AdvancedMarker(markerId: markerId, anchor: updatedAnchorOffset), + }; + + await controller.changeMarkers(updatedMarkers); + + marker = controller.markers[markerId]?.marker; + expect(marker, isNotNull); + expect(marker!.anchorLeft, '60%'); + expect(marker.anchorTop, '-160%'); + }); + testWidgets('markers created with text glyph work', (WidgetTester widgetTester) async { final markers = { AdvancedMarker( diff --git a/packages/google_maps_flutter/google_maps_flutter_web/lib/src/convert.dart b/packages/google_maps_flutter/google_maps_flutter_web/lib/src/convert.dart index 517e129dba1a..d2722816b0fd 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/lib/src/convert.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/lib/src/convert.dart @@ -366,6 +366,30 @@ void _setIconAnchor({required gmaps.Size size, required Offset anchor, required icon.anchor = gmapsAnchor; } +String _advancedMarkerAnchorToCssOffset(double anchor) { + final double percentage = -anchor * 100; + final int rounded = percentage.round(); + if ((percentage - rounded).abs() < 1e-9) { + return '$rounded%'; + } + return '$percentage%'; +} + +void _setAdvancedMarkerOptionsAnchor(gmaps.AdvancedMarkerElementOptions options, Offset anchor) { + options + ..anchorLeft = _advancedMarkerAnchorToCssOffset(anchor.dx) + ..anchorTop = _advancedMarkerAnchorToCssOffset(anchor.dy); +} + +void _copyAdvancedMarkerOptionsAnchor( + gmaps.AdvancedMarkerElement marker, + gmaps.AdvancedMarkerElementOptions options, +) { + marker + ..anchorLeft = options.anchorLeft + ..anchorTop = options.anchorTop; +} + // Sets the size of the Google Maps icon. void _setIconSize({required gmaps.Size size, required gmaps.Icon icon}) { final gmapsSize = gmaps.Size(size.width, size.height); @@ -704,6 +728,7 @@ Future _markerOptionsFromMarker(Marker marker, T? currentMarker) async ..title = sanitizeHtml(marker.infoWindow.title ?? '') ..zIndex = marker.zIndex ..gmpDraggable = marker.draggable; + _setAdvancedMarkerOptionsAnchor(options, marker.anchor); return options as O; } else { final options = gmaps.MarkerOptions() diff --git a/packages/google_maps_flutter/google_maps_flutter_web/lib/src/marker.dart b/packages/google_maps_flutter/google_maps_flutter_web/lib/src/marker.dart index d905b01eab3e..ac7e3f92ccf1 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/lib/src/marker.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/lib/src/marker.dart @@ -312,6 +312,7 @@ class AdvancedMarkerController marker.position = options.position; marker.title = options.title ?? ''; marker.zIndex = options.zIndex; + _copyAdvancedMarkerOptionsAnchor(marker, options); if (_infoWindow != null && newInfoWindowContent != null) { _infoWindow.content = newInfoWindowContent; 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 8836876b552a..ef3a90cd9a57 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter_web description: Web platform implementation of google_maps_flutter repository: https://github.com/flutter/packages/tree/main/packages/google_maps_flutter/google_maps_flutter_web issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22 -version: 0.6.3 +version: 0.6.3+1 environment: sdk: ^3.10.0 @@ -22,7 +22,7 @@ dependencies: sdk: flutter flutter_web_plugins: sdk: flutter - google_maps: ^8.1.0 + google_maps: ^8.3.0 google_maps_flutter_platform_interface: ^2.16.0 sanitize_html: ^2.0.0 stream_transform: ^2.0.0