[google_maps_flutter] Adds long press / long click support to GoogleMap (#1575)
* Adds long press / long click support to GoogleMap
* Adds example for map tap and long press callbacks
diff --git a/packages/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/CHANGELOG.md
index 51d918a..0cda582 100644
--- a/packages/google_maps_flutter/CHANGELOG.md
+++ b/packages/google_maps_flutter/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.5.14
+
+* Adds onLongPress callback for GoogleMap.
+
## 0.5.13
* Add support for Circle overlays.
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 f038bc4..338f33a 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
@@ -56,6 +56,7 @@
MethodChannel.MethodCallHandler,
OnMapReadyCallback,
GoogleMap.OnMapClickListener,
+ GoogleMap.OnMapLongClickListener,
PlatformView {
private static final String TAG = "GoogleMapController";
@@ -171,6 +172,7 @@
googleMap.setOnPolylineClickListener(this);
googleMap.setOnCircleClickListener(this);
googleMap.setOnMapClickListener(this);
+ googleMap.setOnMapLongClickListener(this);
updateMyLocationSettings();
markersController.setGoogleMap(googleMap);
polylinesController.setGoogleMap(googleMap);
@@ -309,6 +311,13 @@
}
@Override
+ public void onMapLongClick(LatLng latLng) {
+ final Map<String, Object> arguments = new HashMap<>(2);
+ arguments.put("position", Convert.latLngToJson(latLng));
+ methodChannel.invokeMethod("map#onLongPress", arguments);
+ }
+
+ @Override
public void onCameraMoveStarted(int reason) {
final Map<String, Object> arguments = new HashMap<>(2);
boolean isGesture = reason == GoogleMap.OnCameraMoveStartedListener.REASON_GESTURE;
diff --git a/packages/google_maps_flutter/example/lib/main.dart b/packages/google_maps_flutter/example/lib/main.dart
index 43a80d1..5a8d28c 100644
--- a/packages/google_maps_flutter/example/lib/main.dart
+++ b/packages/google_maps_flutter/example/lib/main.dart
@@ -4,6 +4,7 @@
import 'package:flutter/material.dart';
import 'animate_camera.dart';
+import 'map_click.dart';
import 'map_coordinates.dart';
import 'map_ui.dart';
import 'marker_icons.dart';
@@ -17,6 +18,7 @@
final List<Page> _allPages = <Page>[
MapUiPage(),
MapCoordinatesPage(),
+ MapClickPage(),
AnimateCameraPage(),
MoveCameraPage(),
PlaceMarkerPage(),
diff --git a/packages/google_maps_flutter/example/lib/map_click.dart b/packages/google_maps_flutter/example/lib/map_click.dart
new file mode 100644
index 0000000..a73595d
--- /dev/null
+++ b/packages/google_maps_flutter/example/lib/map_click.dart
@@ -0,0 +1,90 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+import 'package:google_maps_flutter/google_maps_flutter.dart';
+import 'page.dart';
+
+const CameraPosition _kInitialPosition =
+ CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0);
+
+class MapClickPage extends Page {
+ MapClickPage() : super(const Icon(Icons.mouse), 'Map click');
+
+ @override
+ Widget build(BuildContext context) {
+ return const _MapClickBody();
+ }
+}
+
+class _MapClickBody extends StatefulWidget {
+ const _MapClickBody();
+
+ @override
+ State<StatefulWidget> createState() => _MapClickBodyState();
+}
+
+class _MapClickBodyState extends State<_MapClickBody> {
+ _MapClickBodyState();
+
+ GoogleMapController mapController;
+ LatLng _lastTap;
+ LatLng _lastLongPress;
+
+ @override
+ Widget build(BuildContext context) {
+ final GoogleMap googleMap = GoogleMap(
+ onMapCreated: onMapCreated,
+ initialCameraPosition: _kInitialPosition,
+ onTap: (LatLng pos) {
+ setState(() {
+ _lastTap = pos;
+ });
+ },
+ onLongPress: (LatLng pos) {
+ setState(() {
+ _lastLongPress = pos;
+ });
+ },
+ );
+
+ final List<Widget> columnChildren = <Widget>[
+ Padding(
+ padding: const EdgeInsets.all(10.0),
+ child: Center(
+ child: SizedBox(
+ width: 300.0,
+ height: 200.0,
+ child: googleMap,
+ ),
+ ),
+ ),
+ ];
+
+ if (mapController != null) {
+ final String lastTap = 'Tap:\n${_lastTap ?? ""}\n';
+ final String lastLongPress = 'Long press:\n${_lastLongPress ?? ""}';
+ columnChildren
+ .add(Center(child: Text(lastTap, textAlign: TextAlign.center)));
+ columnChildren.add(Center(
+ child: Text(
+ lastLongPress,
+ textAlign: TextAlign.center,
+ )));
+ }
+
+ return Column(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.stretch,
+ children: columnChildren,
+ );
+ }
+
+ void onMapCreated(GoogleMapController controller) async {
+ setState(() {
+ mapController = controller;
+ });
+ }
+}
diff --git a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m
index 3041b48..5dd1d25 100644
--- a/packages/google_maps_flutter/ios/Classes/GoogleMapController.m
+++ b/packages/google_maps_flutter/ios/Classes/GoogleMapController.m
@@ -334,6 +334,10 @@
[_channel invokeMethod:@"map#onTap" arguments:@{@"position" : LocationToJson(coordinate)}];
}
+- (void)mapView:(GMSMapView*)mapView didLongPressAtCoordinate:(CLLocationCoordinate2D)coordinate {
+ [_channel invokeMethod:@"map#onLongPress" 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 a8660e5..5cc4065 100644
--- a/packages/google_maps_flutter/lib/src/controller.dart
+++ b/packages/google_maps_flutter/lib/src/controller.dart
@@ -72,6 +72,10 @@
case 'map#onTap':
_googleMapState.onTap(LatLng._fromJson(call.arguments['position']));
break;
+ case 'map#onLongPress':
+ _googleMapState
+ .onLongPress(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 fcbc00c..2a2562f 100644
--- a/packages/google_maps_flutter/lib/src/google_map.dart
+++ b/packages/google_maps_flutter/lib/src/google_map.dart
@@ -37,6 +37,7 @@
this.onCameraMove,
this.onCameraIdle,
this.onTap,
+ this.onLongPress,
}) : assert(initialCameraPosition != null),
super(key: key);
@@ -104,6 +105,9 @@
/// Called every time a [GoogleMap] is tapped.
final ArgumentCallback<LatLng> onTap;
+ /// Called every time a [GoogleMap] is long pressed.
+ final ArgumentCallback<LatLng> onLongPress;
+
/// True if a "My Location" layer should be shown on the map.
///
/// This layer includes a location indicator at the current device location,
@@ -296,6 +300,13 @@
widget.onTap(position);
}
}
+
+ void onLongPress(LatLng position) {
+ assert(position != null);
+ if (widget.onLongPress != null) {
+ widget.onLongPress(position);
+ }
+ }
}
/// Configuration options for the GoogleMaps user interface.
diff --git a/packages/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/pubspec.yaml
index 40c4e4b..1238301 100644
--- a/packages/google_maps_flutter/pubspec.yaml
+++ b/packages/google_maps_flutter/pubspec.yaml
@@ -2,7 +2,7 @@
description: A Flutter plugin for integrating Google Maps in iOS and Android applications.
author: Flutter Team <flutter-dev@googlegroups.com>
homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter
-version: 0.5.13
+version: 0.5.14
dependencies:
flutter: