diff --git a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java index 34551e90237a..db430feceaa6 100644 --- a/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java +++ b/packages/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/Convert.java @@ -127,7 +127,7 @@ static Object toJson(String markerId) { return data; } - private static Object toJson(LatLng latLng) { + static Object toJson(LatLng latLng) { return Arrays.asList(latLng.latitude, latLng.longitude); } 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 99aa11a5dd5f..4536009490f7 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 @@ -26,6 +26,7 @@ import com.google.android.gms.maps.MapView; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.model.CameraPosition; +import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLngBounds; import com.google.android.gms.maps.model.Marker; import io.flutter.plugin.common.MethodCall; @@ -49,6 +50,7 @@ final class GoogleMapController GoogleMapOptionsSink, MethodChannel.MethodCallHandler, OnMapReadyCallback, + GoogleMap.OnMapClickListener, PlatformView { private static final String TAG = "GoogleMapController"; @@ -154,6 +156,7 @@ public void onMapReady(GoogleMap googleMap) { googleMap.setOnCameraMoveListener(this); googleMap.setOnCameraIdleListener(this); googleMap.setOnMarkerClickListener(this); + googleMap.setOnMapClickListener(this); updateMyLocationEnabled(); markersController.setGoogleMap(googleMap); updateInitialMarkers(); @@ -212,6 +215,13 @@ public void onMethodCall(MethodCall call, MethodChannel.Result result) { } } + @Override + public void onMapClick(LatLng latLng) { + final Map arguments = new HashMap<>(2); + arguments.put("position", Convert.toJson(latLng)); + methodChannel.invokeMethod("map#onTap", arguments); + } + @Override public void onCameraMoveStarted(int reason) { final Map arguments = new HashMap<>(2); diff --git a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m index da755393be70..aa90929e3428 100644 --- a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m +++ b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m @@ -8,6 +8,7 @@ #pragma mark - Conversion of JSON-like values sent via platform channels. Forward declarations. static NSDictionary* PositionToJson(GMSCameraPosition* position); +static NSArray* LocationToJson(CLLocationCoordinate2D position); static GMSCameraPosition* ToOptionalCameraPosition(NSDictionary* json); static GMSCoordinateBounds* ToOptionalBounds(NSArray* json); static GMSCameraUpdate* ToCameraUpdate(NSArray* data); @@ -242,6 +243,10 @@ - (void)mapView:(GMSMapView*)mapView didTapInfoWindowOfMarker:(GMSMarker*)marker [_markersController onInfoWindowTap:markerId]; } +- (void)mapView:(GMSMapView*)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate { + [_channel invokeMethod:@"map#onTap" arguments:@{@"position" : LocationToJson(coordinate)}]; +} + @end #pragma mark - Implementations of JSON conversion functions. diff --git a/packages/google_maps_flutter/lib/src/controller.dart b/packages/google_maps_flutter/lib/src/controller.dart index bb8b4888eb54..c16c8384fc85 100644 --- a/packages/google_maps_flutter/lib/src/controller.dart +++ b/packages/google_maps_flutter/lib/src/controller.dart @@ -63,6 +63,9 @@ class GoogleMapController { case 'infoWindow#onTap': _googleMapState.onInfoWindowTap(call.arguments['markerId']); break; + case 'map#onTap': + _googleMapState.onTap(LatLng._fromJson(call.arguments['position'])); + break; default: throw MissingPluginException(); } diff --git a/packages/google_maps_flutter/lib/src/google_map.dart b/packages/google_maps_flutter/lib/src/google_map.dart index 794935c21ed7..a75424b03640 100644 --- a/packages/google_maps_flutter/lib/src/google_map.dart +++ b/packages/google_maps_flutter/lib/src/google_map.dart @@ -33,6 +33,7 @@ class GoogleMap extends StatefulWidget { this.onCameraMoveStarted, this.onCameraMove, this.onCameraIdle, + this.onTap, }) : assert(initialCameraPosition != null), super(key: key); @@ -91,6 +92,9 @@ class GoogleMap extends StatefulWidget { /// animations and the user has stopped interacting with the map. final VoidCallback onCameraIdle; + /// Called every time a [GoogleMap] is tapped. + final ArgumentCallback onTap; + /// True if a "My Location" layer should be shown on the map. /// /// This layer includes a location indicator at the current device location, @@ -223,6 +227,11 @@ class _GoogleMapState extends State { final MarkerId markerId = MarkerId(markerIdParam); _markers[markerId].infoWindow.onTap(); } + + void onTap(LatLng position) { + assert(position != null); + widget.onTap(position); + } } /// Configuration options for the GoogleMaps user interface.