From 7e76960edca3e3e891e17f3ce2c36c6faaa32efc Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Tue, 14 Jun 2022 20:38:09 -0400 Subject: [PATCH] [google_maps_flutter] Switch web to structured options (#5965) --- .../google_maps_flutter_web/CHANGELOG.md | 7 +- .../google_maps_controller_test.dart | 76 ++++++++++--------- .../google_maps_plugin_test.dart | 37 +++++---- .../google_maps_plugin_test.mocks.dart | 9 ++- .../lib/google_maps_flutter_web.dart | 1 - .../lib/src/convert.dart | 66 ++++++++-------- .../lib/src/google_maps_controller.dart | 65 ++++++++-------- .../lib/src/google_maps_flutter_web.dart | 33 +++----- .../google_maps_flutter_web/pubspec.yaml | 4 +- 9 files changed, 155 insertions(+), 143 deletions(-) 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 95dfaede8d92..0f040ec5696c 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md @@ -1,5 +1,10 @@ -## NEXT +## 0.4.0 +* Implements the new platform interface versions of `buildView` and + `updateOptions` with structured option types. +* **BREAKING CHANGE**: No longer implements the unstructured option dictionary + versions of those methods, so this version can only be used with + `google_maps_flutter` 2.1.8 or later. * Adds `const` constructor parameters in example tests. ## 0.3.3 diff --git a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_controller_test.dart b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_controller_test.dart index ef9136afa961..dd2520d418f6 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_controller_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_controller_test.dart @@ -40,21 +40,17 @@ void main() { GoogleMapController _createController({ CameraPosition initialCameraPosition = const CameraPosition(target: LatLng(0, 0)), - Set markers = const {}, - Set polygons = const {}, - Set polylines = const {}, - Set circles = const {}, - Map options = const {}, + MapObjects mapObjects = const MapObjects(), + MapConfiguration mapConfiguration = const MapConfiguration(), }) { return GoogleMapController( mapId: mapId, streamController: stream, - initialCameraPosition: initialCameraPosition, - markers: markers, - polygons: polygons, - polylines: polylines, - circles: circles, - mapOptions: options, + widgetConfiguration: MapWidgetConfiguration( + initialCameraPosition: initialCameraPosition, + textDirection: TextDirection.ltr), + mapObjects: mapObjects, + mapConfiguration: mapConfiguration, ); } @@ -284,7 +280,8 @@ void main() { }); testWidgets('renders initial geometry', (WidgetTester tester) async { - controller = _createController(circles: { + controller = _createController( + mapObjects: MapObjects(circles: { const Circle( circleId: CircleId('circle-1'), zIndex: 1234, @@ -327,7 +324,7 @@ void main() { LatLng(43.354469, -5.851318), LatLng(43.354762, -5.850824), ]) - }); + })); controller.debugSetOverrides( circles: circles, @@ -363,9 +360,10 @@ void main() { testWidgets('empty infoWindow does not create InfoWindow instance.', (WidgetTester tester) async { - controller = _createController(markers: { + controller = _createController( + mapObjects: MapObjects(markers: { const Marker(markerId: MarkerId('marker-1')), - }); + })); controller.debugSetOverrides( markers: markers, @@ -385,10 +383,11 @@ void main() { capturedOptions = null; }); testWidgets('translates initial options', (WidgetTester tester) async { - controller = _createController(options: { - 'mapType': 2, - 'zoomControlsEnabled': true, - }); + controller = _createController( + mapConfiguration: const MapConfiguration( + mapType: MapType.satellite, + zoomControlsEnabled: true, + )); controller.debugSetOverrides( createMap: (_, gmaps.MapOptions options) { capturedOptions = options; @@ -407,9 +406,10 @@ void main() { testWidgets('disables gestureHandling with scrollGesturesEnabled false', (WidgetTester tester) async { - controller = _createController(options: { - 'scrollGesturesEnabled': false, - }); + controller = _createController( + mapConfiguration: const MapConfiguration( + scrollGesturesEnabled: false, + )); controller.debugSetOverrides( createMap: (_, gmaps.MapOptions options) { capturedOptions = options; @@ -426,9 +426,10 @@ void main() { testWidgets('disables gestureHandling with zoomGesturesEnabled false', (WidgetTester tester) async { - controller = _createController(options: { - 'zoomGesturesEnabled': false, - }); + controller = _createController( + mapConfiguration: const MapConfiguration( + zoomGesturesEnabled: false, + )); controller.debugSetOverrides( createMap: (_, gmaps.MapOptions options) { capturedOptions = options; @@ -477,9 +478,10 @@ void main() { testWidgets('initializes with traffic layer', (WidgetTester tester) async { - controller = _createController(options: { - 'trafficEnabled': true, - }); + controller = _createController( + mapConfiguration: const MapConfiguration( + trafficEnabled: true, + )); controller.debugSetOverrides(createMap: (_, __) => map); controller.init(); expect(controller.trafficLayer, isNotNull); @@ -505,9 +507,9 @@ void main() { group('updateRawOptions', () { testWidgets('can update `options`', (WidgetTester tester) async { - controller.updateRawOptions({ - 'mapType': 2, - }); + controller.updateMapConfiguration(const MapConfiguration( + mapType: MapType.satellite, + )); expect(map.mapTypeId, gmaps.MapTypeId.SATELLITE); }); @@ -515,15 +517,15 @@ void main() { testWidgets('can turn on/off traffic', (WidgetTester tester) async { expect(controller.trafficLayer, isNull); - controller.updateRawOptions({ - 'trafficEnabled': true, - }); + controller.updateMapConfiguration(const MapConfiguration( + trafficEnabled: true, + )); expect(controller.trafficLayer, isNotNull); - controller.updateRawOptions({ - 'trafficEnabled': false, - }); + controller.updateMapConfiguration(const MapConfiguration( + trafficEnabled: false, + )); expect(controller.trafficLayer, isNull); }); diff --git a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.dart b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.dart index f28a6041da2a..e66a3f47c78c 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.dart @@ -79,10 +79,13 @@ void main() { {}; plugin.debugSetMapById(cache); - final Widget widget = plugin.buildView( + final Widget widget = plugin.buildViewWithConfiguration( testMapId, onPlatformViewCreated, - initialCameraPosition: initialCameraPosition, + widgetConfiguration: const MapWidgetConfiguration( + initialCameraPosition: initialCameraPosition, + textDirection: TextDirection.ltr, + ), ); expect(widget, isA()); @@ -114,10 +117,13 @@ void main() { testMapId: controller, }); - final Widget widget = plugin.buildView( + final Widget widget = plugin.buildViewWithConfiguration( testMapId, onPlatformViewCreated, - initialCameraPosition: initialCameraPosition, + widgetConfiguration: const MapWidgetConfiguration( + initialCameraPosition: initialCameraPosition, + textDirection: TextDirection.ltr, + ), ); expect(widget, equals(expected)); @@ -130,10 +136,13 @@ void main() { {}; plugin.debugSetMapById(cache); - plugin.buildView( + plugin.buildViewWithConfiguration( testMapId, onPlatformViewCreated, - initialCameraPosition: initialCameraPosition, + widgetConfiguration: const MapWidgetConfiguration( + initialCameraPosition: initialCameraPosition, + textDirection: TextDirection.ltr, + ), ); // Simulate Google Maps JS SDK being "ready" @@ -176,11 +185,10 @@ void main() { await plugin.setMapStyle(mapStyle, mapId: 0); final dynamic captured = - verify(controller.updateRawOptions(captureThat(isMap))).captured[0]; + verify(controller.updateStyles(captureThat(isList))).captured[0]; - expect(captured, contains('styles')); final List styles = - captured['styles'] as List; + captured as List; expect(styles.length, 1); // Let's peek inside the styles... final gmaps.MapTypeStyle style = styles[0]; @@ -221,14 +229,13 @@ void main() { plugin.debugSetMapById({mapId: controller}); }); // Options - testWidgets('updateMapOptions', (WidgetTester tester) async { - final Map expectedMapOptions = { - 'someOption': 12345 - }; + testWidgets('updateMapConfiguration', (WidgetTester tester) async { + const MapConfiguration configuration = + MapConfiguration(mapType: MapType.satellite); - await plugin.updateMapOptions(expectedMapOptions, mapId: mapId); + await plugin.updateMapConfiguration(configuration, mapId: mapId); - verify(controller.updateRawOptions(expectedMapOptions)); + verify(controller.updateMapConfiguration(configuration)); }); // Geometry testWidgets('updateMarkers', (WidgetTester tester) async { diff --git a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.mocks.dart b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.mocks.dart index bbc92ffc6096..744552f45d4d 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.mocks.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.mocks.dart @@ -4,6 +4,7 @@ import 'dart:async' as _i2; +import 'package:google_maps/google_maps.dart' as _i5; import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart' as _i3; import 'package:google_maps_flutter_web/google_maps_flutter_web.dart' as _i4; @@ -68,8 +69,12 @@ class MockGoogleMapController extends _i1.Mock void init() => super.noSuchMethod(Invocation.method(#init, []), returnValueForMissingStub: null); @override - void updateRawOptions(Map? optionsUpdate) => - super.noSuchMethod(Invocation.method(#updateRawOptions, [optionsUpdate]), + void updateMapConfiguration(_i3.MapConfiguration? update) => + super.noSuchMethod(Invocation.method(#updateMapConfiguration, [update]), + returnValueForMissingStub: null); + @override + void updateStyles(List<_i5.MapTypeStyle>? styles) => + super.noSuchMethod(Invocation.method(#updateStyles, [styles]), returnValueForMissingStub: null); @override _i2.Future<_i3.LatLngBounds> getVisibleRegion() => (super.noSuchMethod( diff --git a/packages/google_maps_flutter/google_maps_flutter_web/lib/google_maps_flutter_web.dart b/packages/google_maps_flutter/google_maps_flutter_web/lib/google_maps_flutter_web.dart index 7ae646687f19..0650184a14d0 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/lib/google_maps_flutter_web.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/lib/google_maps_flutter_web.dart @@ -10,7 +10,6 @@ import 'dart:html'; import 'dart:js_util'; import 'package:flutter/foundation.dart'; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; 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 c6f3164ff207..250bb5468fa7 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 @@ -13,16 +13,6 @@ final gmaps.LatLngBounds _nullGmapsLatLngBounds = const String _defaultCssColor = '#000000'; const double _defaultCssOpacity = 0.0; -// Indices in the plugin side don't match with the ones -// in the gmaps lib. This translates from plugin -> gmaps. -final Map _mapTypeToMapTypeId = { - 0: gmaps.MapTypeId.ROADMAP, // "none" in the plugin - 1: gmaps.MapTypeId.ROADMAP, - 2: gmaps.MapTypeId.SATELLITE, - 3: gmaps.MapTypeId.TERRAIN, - 4: gmaps.MapTypeId.HYBRID, -}; - // Converts a [Color] into a valid CSS value #RRGGBB. String _getCssColor(Color color) { if (color == null) { @@ -55,49 +45,64 @@ double _getCssOpacity(Color color) { // indoorViewEnabled seems to not have an equivalent in web // buildingsEnabled seems to not have an equivalent in web // padding seems to behave differently in web than mobile. You can't move UI elements in web. -gmaps.MapOptions _rawOptionsToGmapsOptions(Map rawOptions) { +gmaps.MapOptions _configurationAndStyleToGmapsOptions( + MapConfiguration configuration, List styles) { final gmaps.MapOptions options = gmaps.MapOptions(); - if (_mapTypeToMapTypeId.containsKey(rawOptions['mapType'])) { - options.mapTypeId = _mapTypeToMapTypeId[rawOptions['mapType']]; + if (configuration.mapType != null) { + options.mapTypeId = _gmapTypeIDForPluginType(configuration.mapType!); } - if (rawOptions['minMaxZoomPreference'] != null) { - final List minMaxPreference = - rawOptions['minMaxZoomPreference']! as List; + final MinMaxZoomPreference? zoomPreference = + configuration.minMaxZoomPreference; + if (zoomPreference != null) { options - ..minZoom = minMaxPreference[0] as num? - ..maxZoom = minMaxPreference[1] as num?; + ..minZoom = zoomPreference.minZoom + ..maxZoom = zoomPreference.maxZoom; } - if (rawOptions['cameraTargetBounds'] != null) { + if (configuration.cameraTargetBounds != null) { // Needs gmaps.MapOptions.restriction and gmaps.MapRestriction // see: https://developers.google.com/maps/documentation/javascript/reference/map#MapOptions.restriction } - if (rawOptions['zoomControlsEnabled'] != null) { - options.zoomControl = rawOptions['zoomControlsEnabled'] as bool?; - } - - if (rawOptions['styles'] != null) { - options.styles = rawOptions['styles'] as List?; + if (configuration.zoomControlsEnabled != null) { + options.zoomControl = configuration.zoomControlsEnabled; } - if (rawOptions['scrollGesturesEnabled'] == false || - rawOptions['zoomGesturesEnabled'] == false) { + if (configuration.scrollGesturesEnabled == false || + configuration.zoomGesturesEnabled == false) { options.gestureHandling = 'none'; } else { options.gestureHandling = 'auto'; } - // These don't have any rawOptions entry, but they seem to be off in the native maps. + // These don't have any configuration entries, but they seem to be off in the + // native maps. options.mapTypeControl = false; options.fullscreenControl = false; options.streetViewControl = false; + options.styles = styles; + return options; } +gmaps.MapTypeId _gmapTypeIDForPluginType(MapType type) { + switch (type) { + case MapType.satellite: + return gmaps.MapTypeId.SATELLITE; + case MapType.terrain: + return gmaps.MapTypeId.TERRAIN; + case MapType.hybrid: + return gmaps.MapTypeId.HYBRID; + case MapType.normal: + case MapType.none: + default: + return gmaps.MapTypeId.ROADMAP; + } +} + gmaps.MapOptions _applyInitialPosition( CameraPosition initialPosition, gmaps.MapOptions options, @@ -111,11 +116,6 @@ gmaps.MapOptions _applyInitialPosition( return options; } -// Extracts the status of the traffic layer from the rawOptions map. -bool _isTrafficLayerEnabled(Map rawOptions) { - return rawOptions['trafficEnabled'] as bool? ?? false; -} - // The keys we'd expect to see in a serialized MapTypeStyle JSON object. final Set _mapStyleKeys = { 'elementType', diff --git a/packages/google_maps_flutter/google_maps_flutter_web/lib/src/google_maps_controller.dart b/packages/google_maps_flutter/google_maps_flutter_web/lib/src/google_maps_controller.dart index b7e902014281..a659fb218803 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/lib/src/google_maps_controller.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/lib/src/google_maps_controller.dart @@ -15,20 +15,17 @@ class GoogleMapController { GoogleMapController({ required int mapId, required StreamController> streamController, - required CameraPosition initialCameraPosition, - Set markers = const {}, - Set polygons = const {}, - Set polylines = const {}, - Set circles = const {}, - Map mapOptions = const {}, + required MapWidgetConfiguration widgetConfiguration, + MapObjects mapObjects = const MapObjects(), + MapConfiguration mapConfiguration = const MapConfiguration(), }) : _mapId = mapId, _streamController = streamController, - _initialCameraPosition = initialCameraPosition, - _markers = markers, - _polygons = polygons, - _polylines = polylines, - _circles = circles, - _rawMapOptions = mapOptions { + _initialCameraPosition = widgetConfiguration.initialCameraPosition, + _markers = mapObjects.markers, + _polygons = mapObjects.polygons, + _polylines = mapObjects.polylines, + _circles = mapObjects.circles, + _lastMapConfiguration = mapConfiguration { _circlesController = CirclesController(stream: _streamController); _polygonsController = PolygonsController(stream: _streamController); _polylinesController = PolylinesController(stream: _streamController); @@ -56,9 +53,10 @@ class GoogleMapController { final Set _polygons; final Set _polylines; final Set _circles; - // The raw options passed by the user, before converting to gmaps. + // The configuraiton passed by the user, before converting to gmaps. // Caching this allows us to re-create the map faithfully when needed. - Map _rawMapOptions = {}; + MapConfiguration _lastMapConfiguration = const MapConfiguration(); + List _lastStyles = const []; // Creates the 'viewType' for the _widget String _getViewType(int mapId) => 'plugins.flutter.io/google_maps_$mapId'; @@ -158,7 +156,8 @@ class GoogleMapController { /// Failure to call this method would result in the GMap not rendering at all, /// and most of the public methods on this class no-op'ing. void init() { - gmaps.MapOptions options = _rawOptionsToGmapsOptions(_rawMapOptions); + gmaps.MapOptions options = _configurationAndStyleToGmapsOptions( + _lastMapConfiguration, _lastStyles); // Initial position can only to be set here! options = _applyInitialPosition(_initialCameraPosition, options); @@ -177,7 +176,7 @@ class GoogleMapController { polylines: _polylines, ); - _setTrafficLayer(map, _isTrafficLayerEnabled(_rawMapOptions)); + _setTrafficLayer(map, _lastMapConfiguration.trafficEnabled ?? false); } // Funnels map gmap events into the plugin's stream controller. @@ -260,27 +259,33 @@ class GoogleMapController { _polylinesController!.addPolylines(polylines); } - // Merges new options coming from the plugin into the _rawMapOptions map. + // Merges new options coming from the plugin into _lastConfiguration. // - // Returns the updated _rawMapOptions object. - Map _mergeRawOptions(Map newOptions) { - _rawMapOptions = { - ..._rawMapOptions, - ...newOptions, - }; - return _rawMapOptions; + // Returns the updated _lastConfiguration object. + MapConfiguration _mergeConfigurations(MapConfiguration update) { + _lastMapConfiguration = _lastMapConfiguration.applyDiff(update); + return _lastMapConfiguration; } - /// Updates the map options from a `Map`. + /// Updates the map options from a [MapConfiguration]. /// - /// This method converts the map into the proper [gmaps.MapOptions] - void updateRawOptions(Map optionsUpdate) { + /// This method converts the map into the proper [gmaps.MapOptions]. + void updateMapConfiguration(MapConfiguration update) { assert(_googleMap != null, 'Cannot update options on a null map.'); - final Map newOptions = _mergeRawOptions(optionsUpdate); + final MapConfiguration newConfiguration = _mergeConfigurations(update); + final gmaps.MapOptions newOptions = + _configurationAndStyleToGmapsOptions(newConfiguration, _lastStyles); + + _setOptions(newOptions); + _setTrafficLayer(_googleMap!, newConfiguration.trafficEnabled ?? false); + } - _setOptions(_rawOptionsToGmapsOptions(newOptions)); - _setTrafficLayer(_googleMap!, _isTrafficLayerEnabled(newOptions)); + /// Updates the map options with a new list of [styles]. + void updateStyles(List styles) { + _lastStyles = styles; + _setOptions( + _configurationAndStyleToGmapsOptions(_lastMapConfiguration, styles)); } // Sets new [gmaps.MapOptions] on the wrapped map. diff --git a/packages/google_maps_flutter/google_maps_flutter_web/lib/src/google_maps_flutter_web.dart b/packages/google_maps_flutter/google_maps_flutter_web/lib/src/google_maps_flutter_web.dart index 043952d176a0..c2085a2bddfc 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/lib/src/google_maps_flutter_web.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/lib/src/google_maps_flutter_web.dart @@ -47,11 +47,11 @@ class GoogleMapsPlugin extends GoogleMapsFlutterPlatform { /// This attempts to merge the new `optionsUpdate` passed in, with the previous /// options passed to the map (in other updates, or when creating it). @override - Future updateMapOptions( - Map optionsUpdate, { + Future updateMapConfiguration( + MapConfiguration update, { required int mapId, }) async { - _map(mapId).updateRawOptions(optionsUpdate); + _map(mapId).updateMapConfiguration(update); } /// Applies the passed in `markerUpdates` to the `mapId`. @@ -135,9 +135,7 @@ class GoogleMapsPlugin extends GoogleMapsFlutterPlatform { String? mapStyle, { required int mapId, }) async { - _map(mapId).updateRawOptions({ - 'styles': _mapStyles(mapStyle), - }); + _map(mapId).updateStyles(_mapStyles(mapStyle)); } /// Returns the bounds of the current viewport. @@ -289,18 +287,12 @@ class GoogleMapsPlugin extends GoogleMapsFlutterPlatform { } @override - Widget buildView( + Widget buildViewWithConfiguration( int creationId, PlatformViewCreatedCallback onPlatformViewCreated, { - required CameraPosition initialCameraPosition, - Set markers = const {}, - Set polygons = const {}, - Set polylines = const {}, - Set circles = const {}, - Set tileOverlays = const {}, - Set>? gestureRecognizers = - const >{}, - Map mapOptions = const {}, + required MapWidgetConfiguration widgetConfiguration, + MapObjects mapObjects = const MapObjects(), + MapConfiguration mapConfiguration = const MapConfiguration(), }) { // Bail fast if we've already rendered this map ID... if (_mapById[creationId]?.widget != null) { @@ -311,14 +303,11 @@ class GoogleMapsPlugin extends GoogleMapsFlutterPlatform { StreamController>.broadcast(); final GoogleMapController mapController = GoogleMapController( - initialCameraPosition: initialCameraPosition, mapId: creationId, streamController: controller, - markers: markers, - polygons: polygons, - polylines: polylines, - circles: circles, - mapOptions: mapOptions, + widgetConfiguration: widgetConfiguration, + mapObjects: mapObjects, + mapConfiguration: mapConfiguration, )..init(); // Initialize the controller _mapById[creationId] = mapController; 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 b46f7561e78d..a05be66b83ba 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/plugins/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.3.3 +version: 0.4.0 environment: sdk: ">=2.12.0 <3.0.0" @@ -22,7 +22,7 @@ dependencies: flutter_web_plugins: sdk: flutter google_maps: ^6.1.0 - google_maps_flutter_platform_interface: ^2.1.2 + google_maps_flutter_platform_interface: ^2.2.0 sanitize_html: ^2.0.0 stream_transform: ^2.0.0