From 2a878fd0b8b3dad96fa7abf88ce7af784434f601 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 10 Feb 2026 13:07:51 -0500 Subject: [PATCH 1/2] Add failing unit tests --- .../GoogleMapsGroundOverlayControllerTests.m | 16 ++++++++++++++++ .../GoogleMapsMarkerControllerTests.m | 17 +++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerTests/GoogleMapsGroundOverlayControllerTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerTests/GoogleMapsGroundOverlayControllerTests.m index 14a607c8487..158d050c9b3 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerTests/GoogleMapsGroundOverlayControllerTests.m +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerTests/GoogleMapsGroundOverlayControllerTests.m @@ -8,6 +8,7 @@ #import "PartiallyMockedMapView.h" #import "TestAssetProvider.h" +#import "TestMapEventHandler.h" /// A GMSGroundOverlay that ensures that property updates are made before the map is set. @interface PropertyOrderValidatingGroundOverlay : GMSGroundOverlay { @@ -211,6 +212,21 @@ - (void)testUpdateGroundOverlaySetsVisibilityLast { XCTAssertTrue(groundOverlay.hasSetMap); } +- (void)testAssetProviderIsRetained { + FLTGroundOverlaysController *groundOverlayController; + __weak TestAssetProvider *weakAssetProvider; + @autoreleasepool { + TestAssetProvider *assetProvider = [[TestAssetProvider alloc] init]; + weakAssetProvider = assetProvider; + groundOverlayController = [[FLTGroundOverlaysController alloc] + initWithMapView:[GoogleMapsGroundOverlayControllerTests mapView] + eventDelegate:[[TestMapEventHandler alloc] init] + assetProvider:assetProvider]; + } + XCTAssertNotNil(groundOverlayController); + XCTAssertNotNil(weakAssetProvider); +} + /// Returns a simple map view to add map objects to. + (GMSMapView *)mapView { GMSMapViewOptions *mapViewOptions = [[GMSMapViewOptions alloc] init]; diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerTests/GoogleMapsMarkerControllerTests.m b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerTests/GoogleMapsMarkerControllerTests.m index a34b11ae3cc..9e651429114 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerTests/GoogleMapsMarkerControllerTests.m +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/ios/RunnerTests/GoogleMapsMarkerControllerTests.m @@ -268,6 +268,23 @@ - (void)testUpdateMarkerSetsVisibilityLast { XCTAssertTrue(marker.hasSetMap); } +- (void)testAssetProviderIsRetained { + FLTMarkersController *markerController; + __weak TestAssetProvider *weakAssetProvider; + @autoreleasepool { + TestAssetProvider *assetProvider = [[TestAssetProvider alloc] init]; + weakAssetProvider = assetProvider; + + markerController = + [[FLTMarkersController alloc] initWithMapView:[GoogleMapsMarkerControllerTests mapView] + eventDelegate:[[TestMapEventHandler alloc] init] + clusterManagersController:nil + assetProvider:assetProvider]; + } + XCTAssertNotNil(markerController); + XCTAssertNotNil(weakAssetProvider, @"AssetProvider should be retained by the marker controller"); +} + @end @implementation PropertyOrderValidatingMarker From 83ba2c0ab19a9cb4a242b53f2e1ce79dfa25a65d Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 10 Feb 2026 13:11:20 -0500 Subject: [PATCH 2/2] Fix memory model for asset providers --- .../google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md | 4 ++++ .../google_maps_flutter_ios/FGMGroundOverlayController.m | 2 +- .../google_maps_flutter_ios/GoogleMapMarkerController.m | 2 +- .../google_maps_flutter/google_maps_flutter_ios/pubspec.yaml | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md index 3338803175e..8fee3b952a1 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.17.2 + +* Fixes a regression in custom marker icon handling. + ## 2.17.1 * Refactors code for improved testability. diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/ios/google_maps_flutter_ios/Sources/google_maps_flutter_ios/FGMGroundOverlayController.m b/packages/google_maps_flutter/google_maps_flutter_ios/ios/google_maps_flutter_ios/Sources/google_maps_flutter_ios/FGMGroundOverlayController.m index f1fe7281dc0..c5e45188510 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/ios/google_maps_flutter_ios/Sources/google_maps_flutter_ios/FGMGroundOverlayController.m +++ b/packages/google_maps_flutter/google_maps_flutter_ios/ios/google_maps_flutter_ios/Sources/google_maps_flutter_ios/FGMGroundOverlayController.m @@ -89,7 +89,7 @@ @interface FLTGroundOverlaysController () @property(weak, nonatomic) NSObject *eventDelegate; /// Asset provider used to load images. -@property(weak, nonatomic) NSObject *assetProvider; +@property(strong, nonatomic) NSObject *assetProvider; /// The map view used to generate the controllers. @property(weak, nonatomic) GMSMapView *mapView; diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/ios/google_maps_flutter_ios/Sources/google_maps_flutter_ios/GoogleMapMarkerController.m b/packages/google_maps_flutter/google_maps_flutter_ios/ios/google_maps_flutter_ios/Sources/google_maps_flutter_ios/GoogleMapMarkerController.m index 9d061eec8b0..09a05db2840 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/ios/google_maps_flutter_ios/Sources/google_maps_flutter_ios/GoogleMapMarkerController.m +++ b/packages/google_maps_flutter/google_maps_flutter_ios/ios/google_maps_flutter_ios/Sources/google_maps_flutter_ios/GoogleMapMarkerController.m @@ -113,7 +113,7 @@ @interface FLTMarkersController () @property(weak, nonatomic) NSObject *eventDelegate; /// Controller for adding/removing/fetching cluster managers @property(weak, nonatomic, nullable) FGMClusterManagersController *clusterManagersController; -@property(weak, nonatomic) NSObject *assetProvider; +@property(strong, nonatomic) NSObject *assetProvider; @property(weak, nonatomic) GMSMapView *mapView; @end diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_ios/pubspec.yaml index f971ae9b567..b9c5ab33e51 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_ios/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter_ios description: iOS implementation of the google_maps_flutter plugin. repository: https://github.com/flutter/packages/tree/main/packages/google_maps_flutter/google_maps_flutter_ios 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.17.2 environment: sdk: ^3.9.0