diff --git a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md index 3dcd5bd12f93..dcf6c77fabc4 100644 --- a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.18.0 + +* Adds support for editable polylines and polygons on web. + ## 2.17.1 * Updates README to link to implementation packages for platform-specific diff --git a/packages/google_maps_flutter/google_maps_flutter/lib/src/controller.dart b/packages/google_maps_flutter/google_maps_flutter/lib/src/controller.dart index 32ed8a26671f..b9bf23a83570 100644 --- a/packages/google_maps_flutter/google_maps_flutter/lib/src/controller.dart +++ b/packages/google_maps_flutter/google_maps_flutter/lib/src/controller.dart @@ -91,11 +91,23 @@ class GoogleMapController { .onPolylineTap(mapId: mapId) .listen((PolylineTapEvent e) => _googleMapState.onPolylineTap(e.value)), ); + _streamSubscriptions.add( + GoogleMapsFlutterPlatform.instance + .onPolylineEdited(mapId: mapId) + .listen((PolylineEditEvent e) => _googleMapState.onPolylineEdited(e.value, e.points)), + ); _streamSubscriptions.add( GoogleMapsFlutterPlatform.instance .onPolygonTap(mapId: mapId) .listen((PolygonTapEvent e) => _googleMapState.onPolygonTap(e.value)), ); + _streamSubscriptions.add( + GoogleMapsFlutterPlatform.instance + .onPolygonEdited(mapId: mapId) + .listen( + (PolygonEditEvent e) => _googleMapState.onPolygonEdited(e.value, e.points, e.holes), + ), + ); _streamSubscriptions.add( GoogleMapsFlutterPlatform.instance .onCircleTap(mapId: mapId) diff --git a/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart b/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart index 3bd76b784571..d9f8200bf532 100644 --- a/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart +++ b/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart @@ -641,6 +641,14 @@ class _GoogleMapState extends State { } } + void onPolygonEdited(PolygonId polygonId, List points, List> holes) { + final Polygon? polygon = _polygons[polygonId]; + if (polygon == null) { + throw UnknownMapObjectIdError('polygon', polygonId, 'onEdited'); + } + polygon.onEdited?.call(points, holes); + } + void onPolylineTap(PolylineId polylineId) { final Polyline? polyline = _polylines[polylineId]; if (polyline == null) { @@ -652,6 +660,14 @@ class _GoogleMapState extends State { } } + void onPolylineEdited(PolylineId polylineId, List points) { + final Polyline? polyline = _polylines[polylineId]; + if (polyline == null) { + throw UnknownMapObjectIdError('polyline', polylineId, 'onEdited'); + } + polyline.onEdited?.call(points); + } + void onCircleTap(CircleId circleId) { final Circle? circle = _circles[circleId]; if (circle == null) { diff --git a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml index 0342292634b8..348724c8943b 100644 --- a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter description: A Flutter plugin for integrating Google Maps in iOS and Android applications. repository: https://github.com/flutter/packages/tree/main/packages/google_maps_flutter/google_maps_flutter issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22 -version: 2.17.1 +version: 2.18.0 environment: sdk: ^3.10.0 @@ -23,8 +23,8 @@ dependencies: sdk: flutter google_maps_flutter_android: ^2.19.1 google_maps_flutter_ios: ^2.18.0 - google_maps_flutter_platform_interface: ^2.15.0 - google_maps_flutter_web: ^0.6.2 + google_maps_flutter_platform_interface: ^2.16.0 + google_maps_flutter_web: ^0.7.0 dev_dependencies: flutter_test: diff --git a/packages/google_maps_flutter/google_maps_flutter/test/fake_google_maps_flutter_platform.dart b/packages/google_maps_flutter/google_maps_flutter/test/fake_google_maps_flutter_platform.dart index fae706bdb4ed..6c5286886f02 100644 --- a/packages/google_maps_flutter/google_maps_flutter/test/fake_google_maps_flutter_platform.dart +++ b/packages/google_maps_flutter/google_maps_flutter/test/fake_google_maps_flutter_platform.dart @@ -217,11 +217,21 @@ class FakeGoogleMapsFlutterPlatform extends GoogleMapsFlutterPlatform { return mapEventStreamController.stream.whereType(); } + @override + Stream onPolylineEdited({required int mapId}) { + return mapEventStreamController.stream.whereType(); + } + @override Stream onPolygonTap({required int mapId}) { return mapEventStreamController.stream.whereType(); } + @override + Stream onPolygonEdited({required int mapId}) { + return mapEventStreamController.stream.whereType(); + } + @override Stream onCircleTap({required int mapId}) { return mapEventStreamController.stream.whereType(); diff --git a/packages/google_maps_flutter/google_maps_flutter/test/polygon_updates_test.dart b/packages/google_maps_flutter/google_maps_flutter/test/polygon_updates_test.dart index 9ffdd6c5c674..095c7f8ea33e 100644 --- a/packages/google_maps_flutter/google_maps_flutter/test/polygon_updates_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter/test/polygon_updates_test.dart @@ -364,6 +364,37 @@ void main() { expect(map.polygonUpdates.last.polygonsToAdd.isEmpty, true); }); + testWidgets('Setting editable triggers change', (WidgetTester tester) async { + const p1 = Polygon(polygonId: PolygonId('polygon_1')); + const p1Editable = Polygon(polygonId: PolygonId('polygon_1'), editable: true); + + await tester.pumpWidget(_mapWithPolygons({p1})); + await tester.pumpWidget(_mapWithPolygons({p1Editable})); + + final PlatformMapStateRecorder map = platform.lastCreatedMap; + expect(map.polygonUpdates.last.polygonsToChange.length, 1); + expect(map.polygonUpdates.last.polygonsToChange.first.editable, equals(true)); + expect(map.polygonUpdates.last.polygonIdsToRemove.isEmpty, true); + expect(map.polygonUpdates.last.polygonsToAdd.isEmpty, true); + }); + + testWidgets('Update onEdited does not trigger platform change', (WidgetTester tester) async { + var p1 = const Polygon(polygonId: PolygonId('polygon_1'), editable: true); + await tester.pumpWidget(_mapWithPolygons({p1})); + + p1 = Polygon( + polygonId: const PolygonId('polygon_1'), + editable: true, + onEdited: (List points, List> holes) {}, + ); + await tester.pumpWidget(_mapWithPolygons({p1})); + + final PlatformMapStateRecorder map = platform.lastCreatedMap; + expect(map.polygonUpdates.last.polygonsToChange.isEmpty, true); + expect(map.polygonUpdates.last.polygonIdsToRemove.isEmpty, true); + expect(map.polygonUpdates.last.polygonsToAdd.isEmpty, true); + }); + testWidgets('multi-update with delays', (WidgetTester tester) async { platform.simulatePlatformDelay = true; diff --git a/packages/google_maps_flutter/google_maps_flutter/test/polyline_updates_test.dart b/packages/google_maps_flutter/google_maps_flutter/test/polyline_updates_test.dart index de1012dc01ae..cab0f6c0f0b7 100644 --- a/packages/google_maps_flutter/google_maps_flutter/test/polyline_updates_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter/test/polyline_updates_test.dart @@ -194,6 +194,37 @@ void main() { expect(map.polylineUpdates.last.polylinesToAdd.isEmpty, true); }); + testWidgets('Setting editable triggers change', (WidgetTester tester) async { + const p1 = Polyline(polylineId: PolylineId('polyline_1')); + const p1Editable = Polyline(polylineId: PolylineId('polyline_1'), editable: true); + + await tester.pumpWidget(_mapWithPolylines({p1})); + await tester.pumpWidget(_mapWithPolylines({p1Editable})); + + final PlatformMapStateRecorder map = platform.lastCreatedMap; + expect(map.polylineUpdates.last.polylinesToChange.length, 1); + expect(map.polylineUpdates.last.polylinesToChange.first.editable, equals(true)); + expect(map.polylineUpdates.last.polylineIdsToRemove.isEmpty, true); + expect(map.polylineUpdates.last.polylinesToAdd.isEmpty, true); + }); + + testWidgets('Update onEdited does not trigger platform change', (WidgetTester tester) async { + var p1 = const Polyline(polylineId: PolylineId('polyline_1'), editable: true); + await tester.pumpWidget(_mapWithPolylines({p1})); + + p1 = Polyline( + polylineId: const PolylineId('polyline_1'), + editable: true, + onEdited: (List points) {}, + ); + await tester.pumpWidget(_mapWithPolylines({p1})); + + final PlatformMapStateRecorder map = platform.lastCreatedMap; + expect(map.polylineUpdates.last.polylinesToChange.isEmpty, true); + expect(map.polylineUpdates.last.polylineIdsToRemove.isEmpty, true); + expect(map.polylineUpdates.last.polylinesToAdd.isEmpty, true); + }); + testWidgets('multi-update with delays', (WidgetTester tester) async { platform.simulatePlatformDelay = true;