From 88de74b2dc6f816e1a36e5d43b5db74ddd9caf4e Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Thu, 2 May 2024 13:25:18 -0700 Subject: [PATCH] Do not pass ReactContext to getViewManagersMap (#44379) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/44379 A common pattern to implement `ViewManagerOnDemandReactPackage` is to use a `getViewManagersMap` helper. If we capture `ReactApplicationContext` there, we will indefinitely retain the the very first ReactApplicationContext, and break/leak across reloads. Instead we should pass the `ReactApplicationContext` whenever we construct the ViewManager. Changelog: [Internal] Reviewed By: RSNara Differential Revision: D56838427 fbshipit-source-id: 76583dd7f5564ed29f0dbfcef33d8d288cbb90e0 --- .../react/popupmenu/PopupMenuPackage.kt | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/packages/react-native-popup-menu-android/android/src/main/java/com/facebook/react/popupmenu/PopupMenuPackage.kt b/packages/react-native-popup-menu-android/android/src/main/java/com/facebook/react/popupmenu/PopupMenuPackage.kt index a63c9ba8c25..538a9474978 100644 --- a/packages/react-native-popup-menu-android/android/src/main/java/com/facebook/react/popupmenu/PopupMenuPackage.kt +++ b/packages/react-native-popup-menu-android/android/src/main/java/com/facebook/react/popupmenu/PopupMenuPackage.kt @@ -18,35 +18,29 @@ import com.facebook.react.uimanager.ViewManager @ReactModuleList(nativeModules = arrayOf()) public class PopupMenuPackage() : BaseReactPackage(), ViewManagerOnDemandReactPackage { - private var viewManagersMap: Map? = null + private val viewManagersMap: Map = + mapOf( + ReactPopupMenuManager.REACT_CLASS to + ModuleSpec.viewManagerSpec({ ReactPopupMenuManager() }), + ) override fun getModule(name: String, context: ReactApplicationContext): NativeModule? { return null } - private fun getViewManagersMap(): Map { - val viewManagers = - viewManagersMap - ?: mapOf( - ReactPopupMenuManager.REACT_CLASS to - ModuleSpec.viewManagerSpec({ ReactPopupMenuManager() })) - viewManagersMap = viewManagers - return viewManagers - } - protected override fun getViewManagers(context: ReactApplicationContext): List { - return ArrayList(getViewManagersMap().values) + return viewManagersMap.values.toList() } override fun getViewManagerNames(context: ReactApplicationContext): Collection { - return getViewManagersMap().keys + return viewManagersMap.keys } override fun createViewManager( reactContext: ReactApplicationContext, viewManagerName: String ): ViewManager<*, *>? { - val spec: ModuleSpec? = getViewManagersMap().get(viewManagerName) + val spec: ModuleSpec? = viewManagersMap.get(viewManagerName) return if (spec != null) (spec.getProvider().get() as ViewManager<*, *>) else null }