diff --git a/packages/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/CHANGELOG.md index 92e490a5f313..72e459b13453 100644 --- a/packages/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.20+4 + +* Marker drag event + ## 0.5.20+3 * Update Android play-services-maps to 17.0.0 diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java index fe0d3d7c3e48..0ce82b29491f 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java @@ -60,6 +60,7 @@ final class GoogleMapController OnMapReadyCallback, GoogleMap.OnMapClickListener, GoogleMap.OnMapLongClickListener, + GoogleMap.OnMarkerDragListener, PlatformView { private static final String TAG = "GoogleMapController"; @@ -177,6 +178,7 @@ public void onMapReady(GoogleMap googleMap) { googleMap.setOnCameraMoveListener(this); googleMap.setOnCameraIdleListener(this); googleMap.setOnMarkerClickListener(this); + googleMap.setOnMarkerDragListener(this); googleMap.setOnPolygonClickListener(this); googleMap.setOnPolylineClickListener(this); googleMap.setOnCircleClickListener(this); @@ -395,6 +397,17 @@ public boolean onMarkerClick(Marker marker) { return markersController.onMarkerTap(marker.getId()); } + @Override + public void onMarkerDragStart(Marker marker) {} + + @Override + public void onMarkerDrag(Marker marker) {} + + @Override + public void onMarkerDragEnd(Marker marker) { + markersController.onMarkerDragEnd(marker.getId(), marker.getPosition()); + } + @Override public void onPolygonClick(Polygon polygon) { polygonsController.onPolygonTap(polygon.getId()); diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java index 6923a23fd586..1f863467f977 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/MarkersController.java @@ -5,6 +5,7 @@ package io.flutter.plugins.googlemaps; import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import io.flutter.plugin.common.MethodChannel; @@ -75,6 +76,17 @@ boolean onMarkerTap(String googleMarkerId) { return false; } + void onMarkerDragEnd(String googleMarkerId, LatLng latLng) { + String markerId = googleMapsMarkerIdToDartMarkerId.get(googleMarkerId); + if (markerId == null) { + return; + } + final Map data = new HashMap<>(); + data.put("markerId", markerId); + data.put("position", Convert.latLngToJson(latLng)); + methodChannel.invokeMethod("marker#onDragEnd", data); + } + void onInfoWindowTap(String googleMarkerId) { String markerId = googleMapsMarkerIdToDartMarkerId.get(googleMarkerId); if (markerId == null) { diff --git a/packages/google_maps_flutter/example/lib/place_marker.dart b/packages/google_maps_flutter/example/lib/place_marker.dart index e24b0a6cd954..f38ee4320867 100644 --- a/packages/google_maps_flutter/example/lib/place_marker.dart +++ b/packages/google_maps_flutter/example/lib/place_marker.dart @@ -67,6 +67,32 @@ class PlaceMarkerBodyState extends State { } } + void _onMarkerDragEnd(MarkerId markerId, LatLng newPosition) async { + final Marker tappedMarker = markers[markerId]; + if (tappedMarker != null) { + await showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + actions: [ + FlatButton( + child: const Text('OK'), + onPressed: () => Navigator.of(context).pop(), + ) + ], + content: Padding( + padding: const EdgeInsets.symmetric(vertical: 66), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text('Old position: ${tappedMarker.position}'), + Text('New position: $newPosition'), + ], + ))); + }); + } + } + void _add() { final int markerCount = markers.length; @@ -88,6 +114,9 @@ class PlaceMarkerBodyState extends State { onTap: () { _onMarkerTapped(markerId); }, + onDragEnd: (LatLng position) { + _onMarkerDragEnd(markerId, position); + }, ); setState(() { diff --git a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m index f7fcef1a29e2..38a95ca8d882 100644 --- a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m +++ b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m @@ -373,6 +373,11 @@ - (BOOL)mapView:(GMSMapView*)mapView didTapMarker:(GMSMarker*)marker { return [_markersController onMarkerTap:markerId]; } +- (void)mapView:(GMSMapView*)mapView didEndDraggingMarker:(GMSMarker*)marker { + NSString* markerId = marker.userData[0]; + [_markersController onMarkerDragEnd:markerId coordinate:marker.position]; +} + - (void)mapView:(GMSMapView*)mapView didTapInfoWindowOfMarker:(GMSMarker*)marker { NSString* markerId = marker.userData[0]; [_markersController onInfoWindowTap:markerId]; diff --git a/packages/google_maps_flutter/ios/Classes/GoogleMapMarkerController.h b/packages/google_maps_flutter/ios/Classes/GoogleMapMarkerController.h index 898eddeb0792..7b8bccd7b462 100644 --- a/packages/google_maps_flutter/ios/Classes/GoogleMapMarkerController.h +++ b/packages/google_maps_flutter/ios/Classes/GoogleMapMarkerController.h @@ -40,5 +40,6 @@ - (void)changeMarkers:(NSArray*)markersToChange; - (void)removeMarkerIds:(NSArray*)markerIdsToRemove; - (BOOL)onMarkerTap:(NSString*)markerId; +- (void)onMarkerDragEnd:(NSString*)markerId coordinate:(CLLocationCoordinate2D)coordinate; - (void)onInfoWindowTap:(NSString*)markerId; @end diff --git a/packages/google_maps_flutter/ios/Classes/GoogleMapMarkerController.m b/packages/google_maps_flutter/ios/Classes/GoogleMapMarkerController.m index cb5ef461c38c..91b4e7bce2b7 100644 --- a/packages/google_maps_flutter/ios/Classes/GoogleMapMarkerController.m +++ b/packages/google_maps_flutter/ios/Classes/GoogleMapMarkerController.m @@ -284,6 +284,17 @@ - (BOOL)onMarkerTap:(NSString*)markerId { [_methodChannel invokeMethod:@"marker#onTap" arguments:@{@"markerId" : markerId}]; return controller.consumeTapEvents; } +- (void)onMarkerDragEnd:(NSString*)markerId coordinate:(CLLocationCoordinate2D)coordinate { + if (!markerId) { + return; + } + FLTGoogleMapMarkerController* controller = _markerIdToController[markerId]; + if (!controller) { + return; + } + [_methodChannel invokeMethod:@"marker#onDragEnd" + arguments:@{@"markerId" : markerId, @"position" : PositionToJson(coordinate)}]; +} - (void)onInfoWindowTap:(NSString*)markerId { if (markerId && _markerIdToController[markerId]) { [_methodChannel invokeMethod:@"infoWindow#onTap" arguments:@{@"markerId" : markerId}]; diff --git a/packages/google_maps_flutter/lib/src/controller.dart b/packages/google_maps_flutter/lib/src/controller.dart index 97899b9909f8..ec77111bae9d 100644 --- a/packages/google_maps_flutter/lib/src/controller.dart +++ b/packages/google_maps_flutter/lib/src/controller.dart @@ -57,6 +57,10 @@ class GoogleMapController { case 'marker#onTap': _googleMapState.onMarkerTap(call.arguments['markerId']); break; + case 'marker#onDragEnd': + _googleMapState.onMarkerDragEnd(call.arguments['markerId'], + LatLng._fromJson(call.arguments['position'])); + break; case 'infoWindow#onTap': _googleMapState.onInfoWindowTap(call.arguments['markerId']); break; diff --git a/packages/google_maps_flutter/lib/src/google_map.dart b/packages/google_maps_flutter/lib/src/google_map.dart index 1cf641f4c25a..11a83905a74e 100644 --- a/packages/google_maps_flutter/lib/src/google_map.dart +++ b/packages/google_maps_flutter/lib/src/google_map.dart @@ -301,6 +301,14 @@ class _GoogleMapState extends State { } } + void onMarkerDragEnd(String markerIdParam, LatLng position) { + assert(markerIdParam != null); + final MarkerId markerId = MarkerId(markerIdParam); + if (_markers[markerId]?.onDragEnd != null) { + _markers[markerId].onDragEnd(position); + } + } + void onPolygonTap(String polygonIdParam) { assert(polygonIdParam != null); final PolygonId polygonId = PolygonId(polygonIdParam); diff --git a/packages/google_maps_flutter/lib/src/marker.dart b/packages/google_maps_flutter/lib/src/marker.dart index cd39f689422d..1f64f0ee19ff 100644 --- a/packages/google_maps_flutter/lib/src/marker.dart +++ b/packages/google_maps_flutter/lib/src/marker.dart @@ -160,6 +160,7 @@ class Marker { this.visible = true, this.zIndex = 0.0, this.onTap, + this.onDragEnd, }) : assert(alpha == null || (0.0 <= alpha && alpha <= 1.0)); /// Uniquely identifies a [Marker]. @@ -216,6 +217,8 @@ class Marker { /// Callbacks to receive tap events for markers placed on this map. final VoidCallback onTap; + final ValueChanged onDragEnd; + /// Creates a new [Marker] object whose values are the same as this instance, /// unless overwritten by the specified parameters. Marker copyWith({ @@ -231,6 +234,7 @@ class Marker { bool visibleParam, double zIndexParam, VoidCallback onTapParam, + ValueChanged onDragEndParam, }) { return Marker( markerId: markerId, @@ -246,6 +250,7 @@ class Marker { visible: visibleParam ?? visible, zIndex: zIndexParam ?? zIndex, onTap: onTapParam ?? onTap, + onDragEnd: onDragEndParam ?? onDragEnd, ); } diff --git a/packages/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/pubspec.yaml index 60573e275c40..0bcf6dee186a 100644 --- a/packages/google_maps_flutter/pubspec.yaml +++ b/packages/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. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter -version: 0.5.20+3 +version: 0.5.20+4 dependencies: flutter: