Skip to content

Commit dcb75e1

Browse files
committed
fix: flutter plugin lifecycle logic
1 parent 9774479 commit dcb75e1

File tree

3 files changed

+77
-39
lines changed

3 files changed

+77
-39
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ build/
3434
**/doc/api/
3535

3636
# iOS
37+
.build/
3738
Podfile.lock
3839
Pods/
3940
.symlinks/

android/src/main/kotlin/com/google/maps/flutter/navigation/GoogleMapsNavigationPlugin.kt

Lines changed: 66 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -32,64 +32,93 @@ class GoogleMapsNavigationPlugin : FlutterPlugin, ActivityAware {
3232
}
3333
}
3434

35-
internal lateinit var viewRegistry: GoogleMapsViewRegistry
36-
private lateinit var viewMessageHandler: GoogleMapsViewMessageHandler
37-
private lateinit var imageRegistryMessageHandler: GoogleMapsImageRegistryMessageHandler
38-
private lateinit var viewEventApi: ViewEventApi
39-
private lateinit var _binding: FlutterPlugin.FlutterPluginBinding
40-
private lateinit var lifecycle: Lifecycle
41-
internal lateinit var imageRegistry: ImageRegistry
42-
private lateinit var autoViewMessageHandler: GoogleMapsAutoViewMessageHandler
43-
internal lateinit var autoViewEventApi: AutoViewEventApi
35+
internal var viewRegistry: GoogleMapsViewRegistry? = null
36+
internal var imageRegistry: ImageRegistry? = null
37+
internal var autoViewEventApi: AutoViewEventApi? = null
38+
private var viewEventApi: ViewEventApi? = null
39+
40+
private var viewMessageHandler: GoogleMapsViewMessageHandler? = null
41+
private var imageRegistryMessageHandler: GoogleMapsImageRegistryMessageHandler? = null
42+
private var autoViewMessageHandler: GoogleMapsAutoViewMessageHandler? = null
43+
44+
private var lifecycle: Lifecycle? = null
4445

4546
override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
4647
instance = this
48+
49+
// Init view registry and its method channel handlers
4750
viewRegistry = GoogleMapsViewRegistry()
48-
imageRegistry = ImageRegistry()
49-
viewMessageHandler = GoogleMapsViewMessageHandler(viewRegistry)
51+
viewMessageHandler = GoogleMapsViewMessageHandler(viewRegistry!!)
5052
MapViewApi.setUp(binding.binaryMessenger, viewMessageHandler)
51-
imageRegistryMessageHandler = GoogleMapsImageRegistryMessageHandler(imageRegistry)
53+
binding.applicationContext.registerComponentCallbacks(viewRegistry)
54+
55+
// Init image registry and its method channel handlers
56+
imageRegistry = ImageRegistry()
57+
imageRegistryMessageHandler = GoogleMapsImageRegistryMessageHandler(imageRegistry!!)
5258
ImageRegistryApi.setUp(binding.binaryMessenger, imageRegistryMessageHandler)
59+
60+
// Setup platform view factory and its method channel handlers
5361
viewEventApi = ViewEventApi(binding.binaryMessenger)
54-
_binding = binding
55-
binding.applicationContext.registerComponentCallbacks(viewRegistry)
56-
autoViewMessageHandler = GoogleMapsAutoViewMessageHandler(viewRegistry)
62+
val factory = GoogleMapsViewFactory(viewRegistry!!, viewEventApi!!, imageRegistry!!)
63+
binding.platformViewRegistry.registerViewFactory("google_navigation_flutter", factory)
64+
65+
// Setup auto map view method channel handlers
66+
autoViewMessageHandler = GoogleMapsAutoViewMessageHandler(viewRegistry!!)
5767
AutoMapViewApi.setUp(binding.binaryMessenger, autoViewMessageHandler)
5868
autoViewEventApi = AutoViewEventApi(binding.binaryMessenger)
69+
70+
// Setup navigation session manager and its method channel handlers
71+
GoogleMapsNavigationSessionManager.createInstance(binding.binaryMessenger)
72+
val inspectorHandler = GoogleMapsNavigationInspectorHandler(viewRegistry!!)
73+
NavigationInspector.setUp(binding.binaryMessenger, inspectorHandler)
5974
}
6075

6176
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
62-
MapViewApi.setUp(binding.binaryMessenger, null) // Cleanup
77+
// Cleanup method channel handlers
78+
MapViewApi.setUp(binding.binaryMessenger, null)
6379
ImageRegistryApi.setUp(binding.binaryMessenger, null)
80+
AutoMapViewApi.setUp(binding.binaryMessenger, null)
81+
NavigationInspector.setUp(binding.binaryMessenger, null)
82+
6483
GoogleMapsNavigationSessionManager.destroyInstance()
6584
binding.applicationContext.unregisterComponentCallbacks(viewRegistry)
85+
86+
// Cleanup references
87+
viewRegistry = null
88+
viewMessageHandler = null
89+
imageRegistryMessageHandler = null
90+
viewEventApi = null
91+
imageRegistry = null
92+
autoViewMessageHandler = null
93+
autoViewEventApi = null
6694
instance = null
6795
}
6896

69-
override fun onAttachedToActivity(binding: ActivityPluginBinding) {
70-
val factory = GoogleMapsViewFactory(viewRegistry, viewEventApi, imageRegistry)
71-
_binding.platformViewRegistry.registerViewFactory("google_navigation_flutter", factory)
72-
GoogleMapsNavigationSessionManager.createInstance(_binding.binaryMessenger)
73-
val inspectorHandler = GoogleMapsNavigationInspectorHandler(viewRegistry)
74-
NavigationInspector.setUp(_binding.binaryMessenger, inspectorHandler)
75-
GoogleMapsNavigationSessionManager.getInstance().onActivityCreated(binding.activity)
76-
77-
lifecycle = FlutterLifecycleAdapter.getActivityLifecycle(binding)
78-
lifecycle.addObserver(viewRegistry)
79-
lifecycle.addObserver(GoogleMapsNavigationSessionManager.getInstance())
97+
private fun attachActivity(binding: ActivityPluginBinding) {
98+
lifecycle =
99+
FlutterLifecycleAdapter.getActivityLifecycle(binding).also { lc ->
100+
viewRegistry?.let(lc::addObserver)
101+
GoogleMapsNavigationSessionManager.getInstanceOrNull()?.let(lc::addObserver)
102+
}
103+
GoogleMapsNavigationSessionManager.getInstanceOrNull()?.onActivityCreated(binding.activity)
80104
}
81105

82-
override fun onDetachedFromActivityForConfigChanges() {
83-
GoogleMapsNavigationSessionManager.getInstance().onActivityDestroyed()
84-
}
106+
private fun detachActivity(forConfigChange: Boolean) {
107+
lifecycle?.let { lc ->
108+
viewRegistry?.let(lc::removeObserver)
109+
GoogleMapsNavigationSessionManager.getInstanceOrNull()?.let(lc::removeObserver)
110+
}
85111

86-
override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
87-
GoogleMapsNavigationSessionManager.getInstance().onActivityCreated(binding.activity)
112+
GoogleMapsNavigationSessionManager.getInstanceOrNull()?.onActivityDestroyed(forConfigChange)
113+
lifecycle = null
88114
}
89115

90-
override fun onDetachedFromActivity() {
91-
lifecycle.removeObserver(GoogleMapsNavigationSessionManager.getInstance())
92-
GoogleMapsNavigationSessionManager.getInstance().onActivityDestroyed()
93-
lifecycle.removeObserver(viewRegistry)
94-
}
116+
override fun onAttachedToActivity(binding: ActivityPluginBinding) = attachActivity(binding)
117+
118+
override fun onDetachedFromActivityForConfigChanges() = detachActivity(forConfigChange = true)
119+
120+
override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) =
121+
attachActivity(binding)
122+
123+
override fun onDetachedFromActivity() = detachActivity(forConfigChange = false)
95124
}

android/src/main/kotlin/com/google/maps/flutter/navigation/GoogleMapsNavigationSessionManager.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,12 @@ private constructor(private val navigationSessionEventApi: NavigationSessionEven
9898
}
9999
return instance!!
100100
}
101+
102+
/** Get instance if available, or null if not created. */
103+
@Synchronized
104+
fun getInstanceOrNull(): GoogleMapsNavigationSessionManager? {
105+
return instance
106+
}
101107
}
102108

103109
private var navigator: Navigator? = null
@@ -142,8 +148,10 @@ private constructor(private val navigationSessionEventApi: NavigationSessionEven
142148
}
143149

144150
/** Clean up activity reference to prevent memory leaks. */
145-
fun onActivityDestroyed() {
146-
unregisterListeners()
151+
fun onActivityDestroyed(forConfigChange: Boolean) {
152+
if (!forConfigChange) {
153+
unregisterListeners()
154+
}
147155
weakActivity?.clear()
148156
weakActivity = null
149157
weakLifecycleOwner?.clear()

0 commit comments

Comments
 (0)