[google_maps_flutter] fix crash and remove listeners (#2704)
diff --git a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md
index bdc8a73..9754552 100644
--- a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md
+++ b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.5.26+4
+
+* Android: Fix map view crash when "exit app" while using `FragmentActivity`.
+* Android: Remove listeners from `GoogleMap` when disposing.
+
## 0.5.26+3
* iOS: observe the bounds update for the `GMSMapView` to reset the camera setting.
diff --git a/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java b/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java
index 4232b39..6f59aa6 100644
--- a/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java
+++ b/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java
@@ -23,6 +23,7 @@
import android.util.Log;
import android.view.View;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
@@ -59,20 +60,10 @@
implements Application.ActivityLifecycleCallbacks,
DefaultLifecycleObserver,
ActivityPluginBinding.OnSaveInstanceStateListener,
- GoogleMap.OnCameraIdleListener,
- GoogleMap.OnCameraMoveListener,
- GoogleMap.OnCameraMoveStartedListener,
- GoogleMap.OnInfoWindowClickListener,
- GoogleMap.OnMarkerClickListener,
- GoogleMap.OnPolygonClickListener,
- GoogleMap.OnPolylineClickListener,
- GoogleMap.OnCircleClickListener,
GoogleMapOptionsSink,
MethodChannel.MethodCallHandler,
OnMapReadyCallback,
- GoogleMap.OnMapClickListener,
- GoogleMap.OnMapLongClickListener,
- GoogleMap.OnMarkerDragListener,
+ GoogleMapListener,
PlatformView {
private static final String TAG = "GoogleMapController";
@@ -204,16 +195,7 @@
mapReadyResult.success(null);
mapReadyResult = null;
}
- googleMap.setOnCameraMoveStartedListener(this);
- googleMap.setOnCameraMoveListener(this);
- googleMap.setOnCameraIdleListener(this);
- googleMap.setOnMarkerClickListener(this);
- googleMap.setOnMarkerDragListener(this);
- googleMap.setOnPolygonClickListener(this);
- googleMap.setOnPolylineClickListener(this);
- googleMap.setOnCircleClickListener(this);
- googleMap.setOnMapClickListener(this);
- googleMap.setOnMapLongClickListener(this);
+ setGoogleMapListener(this);
updateMyLocationSettings();
markersController.setGoogleMap(googleMap);
polygonsController.setGoogleMap(googleMap);
@@ -544,10 +526,23 @@
}
disposed = true;
methodChannel.setMethodCallHandler(null);
- mapView.onDestroy();
+ setGoogleMapListener(null);
getApplication().unregisterActivityLifecycleCallbacks(this);
}
+ private void setGoogleMapListener(@Nullable GoogleMapListener listener) {
+ googleMap.setOnCameraMoveStartedListener(listener);
+ googleMap.setOnCameraMoveListener(listener);
+ googleMap.setOnCameraIdleListener(listener);
+ googleMap.setOnMarkerClickListener(listener);
+ googleMap.setOnMarkerDragListener(listener);
+ googleMap.setOnPolygonClickListener(listener);
+ googleMap.setOnPolylineClickListener(listener);
+ googleMap.setOnCircleClickListener(listener);
+ googleMap.setOnMapClickListener(listener);
+ googleMap.setOnMapLongClickListener(listener);
+ }
+
// @Override
// The minimum supported version of Flutter doesn't have this method on the PlatformView interface, but the maximum
// does. This will override it when available even with the annotation commented out.
@@ -899,3 +894,16 @@
this.buildingsEnabled = buildingsEnabled;
}
}
+
+interface GoogleMapListener
+ extends GoogleMap.OnCameraIdleListener,
+ GoogleMap.OnCameraMoveListener,
+ GoogleMap.OnCameraMoveStartedListener,
+ GoogleMap.OnInfoWindowClickListener,
+ GoogleMap.OnMarkerClickListener,
+ GoogleMap.OnPolygonClickListener,
+ GoogleMap.OnPolylineClickListener,
+ GoogleMap.OnCircleClickListener,
+ GoogleMap.OnMapClickListener,
+ GoogleMap.OnMapLongClickListener,
+ GoogleMap.OnMarkerDragListener {}
diff --git a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml
index 8c50efc..7831934 100644
--- a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml
+++ b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml
@@ -1,7 +1,7 @@
name: google_maps_flutter
description: A Flutter plugin for integrating Google Maps in iOS and Android applications.
homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter/google_maps_flutter
-version: 0.5.26+3
+version: 0.5.26+4
dependencies:
flutter: