From a0bb5d20d1e96b8ff775d27f7498469d3837f60b Mon Sep 17 00:00:00 2001 From: tenninebt <5684363+tenninebt@users.noreply.github.com> Date: Fri, 4 Sep 2026 18:03:53 +0200 Subject: [PATCH] [google_maps_flutter_platform_interface] Add onPointOfInterestTap support Add PointOfInterestId, PointOfInterestTapEvent, and a default empty onPointOfInterestTap stream so implementations can opt in without a breaking platform-interface change. --- .../CHANGELOG.md | 4 ++++ .../lib/src/events/map_event.dart | 9 ++++++++ .../google_maps_flutter_platform.dart | 5 ++++ .../lib/src/types/point_of_interest_id.dart | 16 +++++++++++++ .../lib/src/types/types.dart | 1 + .../pubspec.yaml | 2 +- .../google_maps_flutter_platform_test.dart | 6 +++++ .../test/types/point_of_interest_id_test.dart | 23 +++++++++++++++++++ 8 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/point_of_interest_id.dart create mode 100644 packages/google_maps_flutter/google_maps_flutter_platform_interface/test/types/point_of_interest_id_test.dart diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md index 8a037e442294..9413e001411e 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.17.0 + +* Adds support for tapping points of interest on the map. + ## 2.16.1 * Fixes the `PinConfig` code sample in the `BitmapDescriptor` documentation. diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/events/map_event.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/events/map_event.dart index 0d3f47cde019..60d11d177ebc 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/events/map_event.dart +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/events/map_event.dart @@ -160,6 +160,15 @@ class GroundOverlayTapEvent extends MapEvent { GroundOverlayTapEvent(super.mapId, super.croundOverlayId); } +/// An event fired when a point of interest is tapped. +class PointOfInterestTapEvent extends MapEvent { + /// Build a PointOfInterestTap Event triggered from the map represented by `mapId`. + /// + /// The `value` of this event is a [PointOfInterestId] object that represents the + /// tapped point of interest. + PointOfInterestTapEvent(super.mapId, super.pointOfInterestId); +} + /// An event fired when a Map is tapped. class MapTapEvent extends _PositionedMapEvent { /// Build an MapTap Event triggered from the map represented by `mapId`. diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/platform_interface/google_maps_flutter_platform.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/platform_interface/google_maps_flutter_platform.dart index 4ca64f66a8c6..2e8b29fdc238 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/platform_interface/google_maps_flutter_platform.dart +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/platform_interface/google_maps_flutter_platform.dart @@ -337,6 +337,11 @@ abstract class GoogleMapsFlutterPlatform extends PlatformInterface { throw UnimplementedError('onCircleTap() has not been implemented.'); } + /// A point of interest has been tapped. + Stream onPointOfInterestTap({required int mapId}) { + return const Stream.empty(); + } + /// A Map has been tapped at a certain [LatLng]. Stream onTap({required int mapId}) { throw UnimplementedError('onTap() has not been implemented.'); diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/point_of_interest_id.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/point_of_interest_id.dart new file mode 100644 index 000000000000..983a1e917b5e --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/point_of_interest_id.dart @@ -0,0 +1,16 @@ +// Copyright 2013 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/foundation.dart' show immutable; + +import 'types.dart'; + +/// Uniquely identifies a point of interest on a [GoogleMap]. +/// +/// The [value] is the Google Maps place ID for the tapped point of interest. +@immutable +class PointOfInterestId extends MapsObjectId { + /// Creates an immutable identifier for a point of interest. + const PointOfInterestId(super.value); +} diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/types.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/types.dart index 80e380674337..673a8406ae6a 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/types.dart +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/types.dart @@ -28,6 +28,7 @@ export 'maps_object_updates.dart'; export 'marker.dart'; export 'marker_updates.dart'; export 'pattern_item.dart'; +export 'point_of_interest_id.dart'; export 'polygon.dart'; export 'polygon_updates.dart'; export 'polyline.dart'; diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml index 2c85bbd8a840..46dc8a5d52f9 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/google_maps_f issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.16.1 +version: 2.17.0 environment: sdk: ^3.10.0 diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/test/platform_interface/google_maps_flutter_platform_test.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/test/platform_interface/google_maps_flutter_platform_test.dart index 2254a30780a9..446e1b88eabf 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/test/platform_interface/google_maps_flutter_platform_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/test/platform_interface/google_maps_flutter_platform_test.dart @@ -95,6 +95,12 @@ void main() { ); }); + test('onPointOfInterestTap() returns empty stream', () async { + final Stream stream = BuildViewGoogleMapsFlutterPlatform() + .onPointOfInterestTap(mapId: 0); + expect(await stream.isEmpty, isTrue); + }); + test('default implementation of `getStyleError` returns null', () async { final GoogleMapsFlutterPlatform platform = BuildViewGoogleMapsFlutterPlatform(); expect(await platform.getStyleError(mapId: 0), null); diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/test/types/point_of_interest_id_test.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/test/types/point_of_interest_id_test.dart new file mode 100644 index 000000000000..082ff61877c5 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/test/types/point_of_interest_id_test.dart @@ -0,0 +1,23 @@ +// Copyright 2013 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + +void main() { + test('PointOfInterestId equality', () { + const id1 = PointOfInterestId('place-123'); + const id2 = PointOfInterestId('place-123'); + const id3 = PointOfInterestId('place-456'); + + expect(id1, equals(id2)); + expect(id1, isNot(equals(id3))); + expect(id1.hashCode, equals(id2.hashCode)); + }); + + test('PointOfInterestId toString', () { + const id = PointOfInterestId('place-123'); + expect(id.toString(), contains('place-123')); + }); +}