From 97c83b0dfd280d7252e0fd7aa3380c224840ddb0 Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Wed, 18 Oct 2023 14:16:06 +0100 Subject: [PATCH 01/12] Revert "Add ExceptionsManagerModule for RNTester (#40767)" This reverts commit 034d815cfdf202a969f4d6a5662bcdcaacba587c. --- .../java/com/facebook/react/runtime/CoreReactPackage.java | 5 ----- .../java/com/facebook/react/uiapp/RNTesterApplication.java | 3 +++ 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/CoreReactPackage.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/CoreReactPackage.java index 7ba138cd6b9654..5ed3e4aa8d1129 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/CoreReactPackage.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/CoreReactPackage.java @@ -19,7 +19,6 @@ import com.facebook.react.module.model.ReactModuleInfoProvider; import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; import com.facebook.react.modules.core.DeviceEventManagerModule; -import com.facebook.react.modules.core.ExceptionsManagerModule; import com.facebook.react.modules.debug.DevSettingsModule; import com.facebook.react.modules.debug.SourceCodeModule; import com.facebook.react.modules.deviceinfo.DeviceInfoModule; @@ -37,7 +36,6 @@ SourceCodeModule.class, LogBoxModule.class, DeviceEventManagerModule.class, - ExceptionsManagerModule.class, }) class CoreReactPackage extends TurboReactPackage { @@ -65,8 +63,6 @@ public NativeModule getModule(String name, ReactApplicationContext reactContext) return new DeviceEventManagerModule(reactContext, mHardwareBackBtnHandler); case LogBoxModule.NAME: return new LogBoxModule(reactContext, mDevSupportManager); - case ExceptionsManagerModule.NAME: - return new ExceptionsManagerModule(mDevSupportManager); default: throw new IllegalArgumentException( "In BridgelessReactPackage, could not find Native module for " + name); @@ -89,7 +85,6 @@ public ReactModuleInfoProvider getReactModuleInfoProvider() { DevSettingsModule.class, DeviceEventManagerModule.class, LogBoxModule.class, - ExceptionsManagerModule.class, }; final Map reactModuleInfoMap = new HashMap<>(); for (Class moduleClass : moduleList) { diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java index a1c02a8f005f82..8bf2493c5a8945 100644 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java @@ -170,6 +170,9 @@ public void onCreate() { @Override public ReactNativeHost getReactNativeHost() { + if (ReactFeatureFlags.enableBridgelessArchitecture) { + throw new RuntimeException("Should not use ReactNativeHost when Bridgeless enabled"); + } return mReactNativeHost; } From 04e1726e0e5d3bf37ae38bcad9ab87bf6a4bc725 Mon Sep 17 00:00:00 2001 From: Oleksii Date: Tue, 3 Oct 2023 17:12:56 -0700 Subject: [PATCH 02/12] rewrite RNTesterApplication to kotlin (#39557) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Rewrite `RNTesterApplication` to Kotlin as per [Help us Kotlin-ify React Native tests - Round 2](https://github.com/facebook/react-native/issues/38825) ## Changelog: [ANDROID] [CHANGED] - Rewrite RNTesterApplication to Kotlin, add AnnotationTarget property. Pull Request resolved: https://github.com/facebook/react-native/pull/39557 Test Plan: `yarn && yarn android` ✅ The only thing I'm kinda unsure of is whether `AnnotationTarget.PROPERTY` should be added, but it didn't let me annotate `reactHostInterface` without that and didn't compile. image cortinico mdvacca Reviewed By: cortinico Differential Revision: D49598401 Pulled By: mdvacca fbshipit-source-id: 105ae0c13c93dae0eeb2b6fa9040f03f42d2736a --- .../annotations/UnstableReactNativeAPI.kt | 2 +- .../react/uiapp/RNTesterApplication.java | 214 ------------------ .../react/uiapp/RNTesterApplication.kt | 164 ++++++++++++++ 3 files changed, 165 insertions(+), 215 deletions(-) delete mode 100644 packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java create mode 100644 packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/annotations/UnstableReactNativeAPI.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/annotations/UnstableReactNativeAPI.kt index 3996580c313e4d..5ae0b1779a3b24 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/annotations/UnstableReactNativeAPI.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/common/annotations/UnstableReactNativeAPI.kt @@ -8,7 +8,7 @@ package com.facebook.react.common.annotations @Retention(AnnotationRetention.RUNTIME) -@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) +@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY) @RequiresOptIn( level = RequiresOptIn.Level.ERROR, message = "This API is experimental and is likely to change or to be removed in the future") diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java deleted file mode 100644 index 8bf2493c5a8945..00000000000000 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.react.uiapp; - -import android.app.Application; -import androidx.annotation.NonNull; -import com.facebook.fbreact.specs.SampleLegacyModule; -import com.facebook.fbreact.specs.SampleTurboModule; -import com.facebook.react.JSEngineResolutionAlgorithm; -import com.facebook.react.ReactApplication; -import com.facebook.react.ReactNativeHost; -import com.facebook.react.ReactPackage; -import com.facebook.react.TurboReactPackage; -import com.facebook.react.bridge.NativeModule; -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.common.annotations.UnstableReactNativeAPI; -import com.facebook.react.common.assets.ReactFontManager; -import com.facebook.react.common.mapbuffer.ReadableMapBuffer; -import com.facebook.react.config.ReactFeatureFlags; -import com.facebook.react.defaults.DefaultComponentsRegistry; -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; -import com.facebook.react.defaults.DefaultReactNativeHost; -import com.facebook.react.fabric.ComponentFactory; -import com.facebook.react.flipper.ReactNativeFlipper; -import com.facebook.react.interfaces.ReactHost; -import com.facebook.react.interfaces.exceptionmanager.ReactJsExceptionHandler; -import com.facebook.react.module.model.ReactModuleInfo; -import com.facebook.react.module.model.ReactModuleInfoProvider; -import com.facebook.react.runtime.ReactHostImpl; -import com.facebook.react.shell.MainReactPackage; -import com.facebook.react.uiapp.component.MyLegacyViewManager; -import com.facebook.react.uiapp.component.MyNativeViewManager; -import com.facebook.react.uimanager.ViewManager; -import com.facebook.soloader.SoLoader; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class RNTesterApplication extends Application implements ReactApplication { - - private ReactHostImpl mReactHost; - - private final ReactNativeHost mReactNativeHost = - new DefaultReactNativeHost(this) { - @Override - public String getJSMainModuleName() { - return "js/RNTesterApp.android"; - } - - @Override - public String getBundleAssetName() { - return "RNTesterApp.android.bundle"; - } - - @Override - public boolean getUseDeveloperSupport() { - return BuildConfig.DEBUG; - } - - @Override - public List getPackages() { - return Arrays.asList( - new MainReactPackage(), - new TurboReactPackage() { - public NativeModule getModule( - final String name, final ReactApplicationContext reactContext) { - if (!ReactFeatureFlags.useTurboModules) { - return null; - } - - if (SampleTurboModule.NAME.equals(name)) { - return new SampleTurboModule(reactContext); - } - - if (SampleLegacyModule.NAME.equals(name)) { - return new SampleLegacyModule(reactContext); - } - - return null; - } - - // Note: Specialized annotation processor for @ReactModule isn't configured in OSS - // yet. For now, hardcode this information, though it's not necessary for most - // modules. - public ReactModuleInfoProvider getReactModuleInfoProvider() { - return new ReactModuleInfoProvider() { - public Map getReactModuleInfos() { - final Map moduleInfos = new HashMap<>(); - if (ReactFeatureFlags.useTurboModules) { - moduleInfos.put( - SampleTurboModule.NAME, - new ReactModuleInfo( - SampleTurboModule.NAME, - "SampleTurboModule", - false, // canOverrideExistingModule - false, // needsEagerInit - false, // isCxxModule - true // isTurboModule - )); - - moduleInfos.put( - SampleLegacyModule.NAME, - new ReactModuleInfo( - SampleLegacyModule.NAME, - "SampleLegacyModule", - false, // canOverrideExistingModule - false, // needsEagerInit - false, // isCxxModule - false // isTurboModule - )); - } - return moduleInfos; - } - }; - } - }, - new ReactPackage() { - @NonNull - @Override - public List createNativeModules( - @NonNull ReactApplicationContext reactContext) { - return Collections.emptyList(); - } - - @NonNull - @Override - public List createViewManagers( - @NonNull ReactApplicationContext reactContext) { - List viewManagers = new ArrayList<>(); - viewManagers.add(new MyNativeViewManager()); - viewManagers.add(new MyLegacyViewManager(reactContext)); - return viewManagers; - } - }); - } - - @Override - protected boolean isNewArchEnabled() { - return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; - } - - @Override - protected Boolean isHermesEnabled() { - return BuildConfig.IS_HERMES_ENABLED_IN_FLAVOR; - } - }; - - @Override - public void onCreate() { - ReactFontManager.getInstance().addCustomFont(this, "Rubik", R.font.rubik); - super.onCreate(); - SoLoader.init(this, /* native exopackage */ false); - if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { - DefaultNewArchitectureEntryPoint.load(); - } - if (ReactFeatureFlags.enableBridgelessArchitecture) { - // TODO: initialize Flipper for Bridgeless - } else { - ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); - } - } - - @Override - public ReactNativeHost getReactNativeHost() { - if (ReactFeatureFlags.enableBridgelessArchitecture) { - throw new RuntimeException("Should not use ReactNativeHost when Bridgeless enabled"); - } - return mReactNativeHost; - } - - @Override - @UnstableReactNativeAPI - public ReactHost getReactHost() { - if (mReactHost == null) { - // Create an instance of ReactHost to manager the instance of ReactInstance, - // which is similar to how we use ReactNativeHost to manager instance of ReactInstanceManager - RNTesterReactHostDelegate reactHostDelegate = - new RNTesterReactHostDelegate(getApplicationContext()); - RNTesterReactJsExceptionHandler reactJsExceptionHandler = - new RNTesterReactJsExceptionHandler(); - - ComponentFactory componentFactory = new ComponentFactory(); - DefaultComponentsRegistry.register(componentFactory); - mReactHost = - new ReactHostImpl( - this.getApplicationContext(), - reactHostDelegate, - componentFactory, - true, - reactJsExceptionHandler, - true); - if (BuildConfig.IS_HERMES_ENABLED_IN_FLAVOR) { - mReactHost.setJSEngineResolutionAlgorithm(JSEngineResolutionAlgorithm.HERMES); - } else { - mReactHost.setJSEngineResolutionAlgorithm(JSEngineResolutionAlgorithm.JSC); - } - reactHostDelegate.setReactHost(mReactHost); - } - return mReactHost; - } - - @UnstableReactNativeAPI - public static class RNTesterReactJsExceptionHandler implements ReactJsExceptionHandler { - public void reportJsException(ReadableMapBuffer errorMap) {} - } -}; diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt new file mode 100644 index 00000000000000..df047df257baba --- /dev/null +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt @@ -0,0 +1,164 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +package com.facebook.react.uiapp + +import android.app.Application +import com.facebook.fbreact.specs.SampleLegacyModule +import com.facebook.fbreact.specs.SampleTurboModule +import com.facebook.react.JSEngineResolutionAlgorithm +import com.facebook.react.ReactApplication +import com.facebook.react.ReactNativeHost +import com.facebook.react.ReactPackage +import com.facebook.react.TurboReactPackage +import com.facebook.react.bridge.NativeModule +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.common.annotations.UnstableReactNativeAPI +import com.facebook.react.common.assets.ReactFontManager +import com.facebook.react.common.mapbuffer.ReadableMapBuffer +import com.facebook.react.config.ReactFeatureFlags +import com.facebook.react.defaults.DefaultComponentsRegistry.Companion.register +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load +import com.facebook.react.defaults.DefaultReactNativeHost +import com.facebook.react.fabric.ComponentFactory +import com.facebook.react.flipper.ReactNativeFlipper.initializeFlipper +import com.facebook.react.interfaces.ReactHost +import com.facebook.react.interfaces.exceptionmanager.ReactJsExceptionHandler +import com.facebook.react.module.model.ReactModuleInfo +import com.facebook.react.module.model.ReactModuleInfoProvider +import com.facebook.react.runtime.ReactHostImpl +import com.facebook.react.shell.MainReactPackage +import com.facebook.react.uiapp.component.MyLegacyViewManager +import com.facebook.react.uiapp.component.MyNativeViewManager +import com.facebook.react.uimanager.ViewManager +import com.facebook.soloader.SoLoader + +class RNTesterApplication : Application(), ReactApplication { + override val reactNativeHost: ReactNativeHost by lazy { + if (ReactFeatureFlags.enableBridgelessArchitecture) { + throw RuntimeException("Should not use ReactNativeHost when Bridgeless enabled") + } + object : DefaultReactNativeHost(this) { + public override fun getJSMainModuleName(): String = "js/RNTesterApp.android" + + public override fun getBundleAssetName(): String = "RNTesterApp.android.bundle" + + override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG + + public override fun getPackages(): List { + return listOf( + MainReactPackage(), + object : TurboReactPackage() { + override fun getModule( + name: String, + reactContext: ReactApplicationContext + ): NativeModule? { + if (!ReactFeatureFlags.useTurboModules) { + return null + } + if (SampleTurboModule.NAME == name) { + return SampleTurboModule(reactContext) + } + if (SampleLegacyModule.NAME == name) { + return SampleLegacyModule(reactContext) + } + return null + } + + // Note: Specialized annotation processor for @ReactModule isn't configured in OSS + // yet. For now, hardcode this information, though it's not necessary for most + // modules. + override fun getReactModuleInfoProvider(): ReactModuleInfoProvider = + ReactModuleInfoProvider { + if (ReactFeatureFlags.useTurboModules) { + mapOf( + SampleTurboModule.NAME to + ReactModuleInfo( + SampleTurboModule.NAME, + "SampleTurboModule", + false, // canOverrideExistingModule + false, // needsEagerInit + false, // isCxxModule + true // isTurboModule + ), + SampleLegacyModule.NAME to + ReactModuleInfo( + SampleLegacyModule.NAME, + "SampleLegacyModule", + false, // canOverrideExistingModule + false, // needsEagerInit + false, // isCxxModule + false // isTurboModule + )) + } else { + emptyMap() + } + } + }, + object : ReactPackage { + override fun createNativeModules( + reactContext: ReactApplicationContext + ): List { + return emptyList() + } + + override fun createViewManagers( + reactContext: ReactApplicationContext + ): List> = + listOf(MyNativeViewManager(), MyLegacyViewManager(reactContext)) + }) + } + + override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED + override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED_IN_FLAVOR + } + } + + override fun onCreate() { + ReactFontManager.getInstance().addCustomFont(this, "Rubik", R.font.rubik) + super.onCreate() + SoLoader.init(this, /* native exopackage */ false) + if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { + load() + } + if (ReactFeatureFlags.enableBridgelessArchitecture) { + // TODO: initialize Flipper for Bridgeless + } else { + initializeFlipper(this, reactNativeHost.reactInstanceManager) + } + } + + @UnstableReactNativeAPI + override val reactHost: ReactHost by lazy { + // Create an instance of ReactHost to manager the instance of ReactInstance, + // which is similar to how we use ReactNativeHost to manager instance of ReactInstanceManager + val reactHostDelegate = RNTesterReactHostDelegate(applicationContext) + val reactJsExceptionHandler = RNTesterReactJsExceptionHandler() + val componentFactory = ComponentFactory() + register(componentFactory) + ReactHostImpl( + this.applicationContext, + reactHostDelegate, + componentFactory, + true, + reactJsExceptionHandler, + true) + .apply { + jsEngineResolutionAlgorithm = + if (BuildConfig.IS_HERMES_ENABLED_IN_FLAVOR) { + JSEngineResolutionAlgorithm.HERMES + } else { + JSEngineResolutionAlgorithm.JSC + } + reactHostDelegate.reactHost = this + } + } + + @UnstableReactNativeAPI + class RNTesterReactJsExceptionHandler : ReactJsExceptionHandler { + override fun reportJsException(errorMap: ReadableMapBuffer?) {} + } +} From 398352e97b365e04a322e0c59dc531bbb428e2c4 Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Wed, 4 Oct 2023 14:24:17 -0700 Subject: [PATCH 03/12] Do not guard initializeFlipper for bridgeless for RN Tester Summary: We don't need this if-than-else because the initializeFlipper already checks if we're on bridgeless or not Changelog: [Internal] [Changed] - Do not guard initializeFlipper for bridgeless for RN Tester Reviewed By: NickGerleman Differential Revision: D49881903 fbshipit-source-id: e6bfc941b43382580bd418a5f27ad9426d300c69 --- .../java/com/facebook/react/uiapp/RNTesterApplication.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt index df047df257baba..67d39e3d555396 100644 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt @@ -124,11 +124,7 @@ class RNTesterApplication : Application(), ReactApplication { if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { load() } - if (ReactFeatureFlags.enableBridgelessArchitecture) { - // TODO: initialize Flipper for Bridgeless - } else { - initializeFlipper(this, reactNativeHost.reactInstanceManager) - } + initializeFlipper(this, reactNativeHost.reactInstanceManager) } @UnstableReactNativeAPI From c39eead63b38c4a672b1ad644b363864910f3bc8 Mon Sep 17 00:00:00 2001 From: Lulu Wu Date: Thu, 5 Oct 2023 07:04:57 -0700 Subject: [PATCH 04/12] Fix new arch example not render in RNTester (#39810) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/39810 Two issues will be fixed: - Bridgeless has lazy view manager loading by default so the React Package that provides view managers must implement ViewManagerOnDemandReactPackage, we might could refactor the design of package classes later - ThemedReactContext should **NOT** be used directly to call function ```getJSModule```, since it doesn't overrides ```getJSModule``` for Bridgeless, we can use it's internal variable ```meactApplicationContext``` which should be an instance of BridgelessReactContext Reviewed By: cortinico Differential Revision: D49912656 fbshipit-source-id: a0bdd717612398e8d7a6f36d36dba241a3b06bd7 --- .../react/uiapp/RNTesterReactHostDelegate.kt | 19 ++++++++++++++++++- .../uiapp/component/MyLegacyViewManager.kt | 4 ++-- .../react/uiapp/component/MyNativeView.kt | 6 +++--- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.kt b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.kt index aa0111fec1328f..b7b2f13ebf086d 100644 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.kt +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.kt @@ -14,6 +14,7 @@ import com.facebook.react.JSEngineResolutionAlgorithm import com.facebook.react.ReactPackage import com.facebook.react.ReactPackageTurboModuleManagerDelegate import com.facebook.react.TurboReactPackage +import com.facebook.react.ViewManagerOnDemandReactPackage import com.facebook.react.bridge.JSBundleLoader import com.facebook.react.bridge.NativeModule import com.facebook.react.bridge.ReactApplicationContext @@ -108,7 +109,7 @@ class RNTesterReactHostDelegate internal constructor(context: Context) : ReactHo } } }, - object : ReactPackage { + object : ViewManagerOnDemandReactPackage, ReactPackage { override fun createNativeModules( reactContext: ReactApplicationContext ): List = emptyList() @@ -117,6 +118,22 @@ class RNTesterReactHostDelegate internal constructor(context: Context) : ReactHo reactContext: ReactApplicationContext ): List> = listOf(MyNativeViewManager(), MyLegacyViewManager(reactContext)) + + override fun getViewManagerNames( + reactContext: ReactApplicationContext + ): Collection = + listOf(MyNativeViewManager.REACT_CLASS, MyLegacyViewManager.REACT_CLASS) + + override fun createViewManager( + reactContext: ReactApplicationContext, + viewManagerName: String + ): ViewManager<*, *>? { + return when (viewManagerName) { + MyNativeViewManager.REACT_CLASS -> MyNativeViewManager() + MyLegacyViewManager.REACT_CLASS -> MyLegacyViewManager(reactContext) + else -> null + } + } }) } } diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/component/MyLegacyViewManager.kt b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/component/MyLegacyViewManager.kt index 5845e85af5390f..1ff6b782db7b5c 100644 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/component/MyLegacyViewManager.kt +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/component/MyLegacyViewManager.kt @@ -26,8 +26,8 @@ internal class MyLegacyViewManager(reactContext: ReactApplicationContext) : override fun getName(): String = REACT_CLASS - override fun createViewInstance(reactContext: ThemedReactContext): MyNativeView = - MyNativeView(reactContext).apply { setBackgroundColor(Color.RED) } + override fun createViewInstance(themedReactContext: ThemedReactContext): MyNativeView = + MyNativeView(themedReactContext).apply { setBackgroundColor(Color.RED) } @ReactProp(name = ViewProps.OPACITY, defaultFloat = 1f) override fun setOpacity(view: MyNativeView, opacity: Float) { diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/component/MyNativeView.kt b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/component/MyNativeView.kt index 78584e08f89d69..9f8a89a3e15238 100644 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/component/MyNativeView.kt +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/component/MyNativeView.kt @@ -7,7 +7,6 @@ package com.facebook.react.uiapp.component -import android.content.Context import android.graphics.Color import android.graphics.drawable.GradientDrawable import android.view.View @@ -15,13 +14,15 @@ import com.facebook.react.bridge.Arguments import com.facebook.react.bridge.ReactContext import com.facebook.react.bridge.WritableArray import com.facebook.react.bridge.WritableMap +import com.facebook.react.uimanager.ThemedReactContext import com.facebook.react.uimanager.UIManagerHelper import com.facebook.react.uimanager.events.Event import com.facebook.react.uimanager.events.RCTEventEmitter -class MyNativeView(context: Context) : View(context) { +class MyNativeView(context: ThemedReactContext) : View(context) { private var currentColor = 0 private var background: GradientDrawable = GradientDrawable() + private var reactContext: ReactContext = context.getReactApplicationContext() override fun setBackgroundColor(color: Int) { if (color != currentColor) { @@ -51,7 +52,6 @@ class MyNativeView(context: Context) : View(context) { Color.colorToHSV(color, hsv) event.putMap("backgroundColor", backgroundColor) - val reactContext = context as ReactContext reactContext.getJSModule(RCTEventEmitter::class.java).receiveEvent(id, "onColorChanged", event) } From 6dcf468f068621a0022fa163e7326d934fcbc29a Mon Sep 17 00:00:00 2001 From: David Vacca Date: Thu, 5 Oct 2023 17:11:39 -0700 Subject: [PATCH 05/12] Move ReactHost to com.facebook.react (#39769) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/39769 Move ReactHost to com.facebook.react bypass-github-export-checks changelog: [internal] internal Reviewed By: javache Differential Revision: D49834870 fbshipit-source-id: 2cfdd34297399115457424f0ba1279fd477da4a1 --- .../main/java/com/facebook/react/ReactActivityDelegate.java | 1 - .../src/main/java/com/facebook/react/ReactApplication.kt | 1 - .../src/main/java/com/facebook/react/ReactDelegate.java | 1 - .../main/java/com/facebook/react/{interfaces => }/ReactHost.kt | 3 ++- .../main/java/com/facebook/react/defaults/DefaultReactHost.kt | 2 +- .../main/java/com/facebook/react/runtime/ReactHostImpl.java | 2 +- .../app/src/main/java/com/helloworld/MainApplication.kt | 2 +- .../main/java/com/facebook/react/uiapp/RNTesterApplication.kt | 3 ++- 8 files changed, 7 insertions(+), 8 deletions(-) rename packages/react-native/ReactAndroid/src/main/java/com/facebook/react/{interfaces => }/ReactHost.kt (98%) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java index 8546a5d6e149b7..61d8e0af79f1e2 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java @@ -19,7 +19,6 @@ import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.Callback; import com.facebook.react.config.ReactFeatureFlags; -import com.facebook.react.interfaces.ReactHost; import com.facebook.react.modules.core.PermissionListener; /** diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactApplication.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactApplication.kt index 3f572fa149eae4..5131e55c4c5a16 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactApplication.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactApplication.kt @@ -8,7 +8,6 @@ package com.facebook.react import com.facebook.react.common.annotations.UnstableReactNativeAPI -import com.facebook.react.interfaces.ReactHost @OptIn(UnstableReactNativeAPI::class) /** Interface that represents an instance of a React Native application */ diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.java index de1ca03272207c..fab2a26dde2842 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.java @@ -16,7 +16,6 @@ import com.facebook.infer.annotation.Assertions; import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.devsupport.DoubleTapReloadRecognizer; -import com.facebook.react.interfaces.ReactHost; import com.facebook.react.interfaces.fabric.ReactSurface; import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/interfaces/ReactHost.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactHost.kt similarity index 98% rename from packages/react-native/ReactAndroid/src/main/java/com/facebook/react/interfaces/ReactHost.kt rename to packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactHost.kt index 4c5ef17ae36481..9465464c1c8a7f 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/interfaces/ReactHost.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactHost.kt @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. */ -package com.facebook.react.interfaces +package com.facebook.react import android.app.Activity import android.content.Context @@ -15,6 +15,7 @@ import com.facebook.react.bridge.queue.ReactQueueConfiguration import com.facebook.react.common.LifecycleState import com.facebook.react.common.annotations.UnstableReactNativeAPI import com.facebook.react.devsupport.interfaces.DevSupportManager +import com.facebook.react.interfaces.TaskInterface import com.facebook.react.interfaces.fabric.ReactSurface import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactHost.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactHost.kt index cb8ce917c46680..d727a0bc6e61aa 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactHost.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactHost.kt @@ -8,11 +8,11 @@ package com.facebook.react.defaults import android.content.Context +import com.facebook.react.ReactHost import com.facebook.react.ReactPackage import com.facebook.react.bridge.JSBundleLoader import com.facebook.react.common.annotations.UnstableReactNativeAPI import com.facebook.react.fabric.ComponentFactory -import com.facebook.react.interfaces.ReactHost import com.facebook.react.interfaces.exceptionmanager.ReactJsExceptionHandler import com.facebook.react.runtime.JSCInstance import com.facebook.react.runtime.ReactHostImpl diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java index a06f19d7ee44e8..b8ed249d140798 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java @@ -25,6 +25,7 @@ import com.facebook.infer.annotation.ThreadSafe; import com.facebook.react.JSEngineResolutionAlgorithm; import com.facebook.react.MemoryPressureRouter; +import com.facebook.react.ReactHost; import com.facebook.react.ReactInstanceEventListener; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.JSBundleLoader; @@ -48,7 +49,6 @@ import com.facebook.react.devsupport.interfaces.DevSupportManager; import com.facebook.react.fabric.ComponentFactory; import com.facebook.react.fabric.FabricUIManager; -import com.facebook.react.interfaces.ReactHost; import com.facebook.react.interfaces.TaskInterface; import com.facebook.react.interfaces.exceptionmanager.ReactJsExceptionHandler; import com.facebook.react.interfaces.fabric.ReactSurface; diff --git a/packages/react-native/template/android/app/src/main/java/com/helloworld/MainApplication.kt b/packages/react-native/template/android/app/src/main/java/com/helloworld/MainApplication.kt index 7314ad2aad3084..1d4c868ed580f9 100644 --- a/packages/react-native/template/android/app/src/main/java/com/helloworld/MainApplication.kt +++ b/packages/react-native/template/android/app/src/main/java/com/helloworld/MainApplication.kt @@ -3,6 +3,7 @@ package com.helloworld import android.app.Application import com.facebook.react.PackageList import com.facebook.react.ReactApplication +import com.facebook.react.ReactHost import com.facebook.react.ReactNativeHost import com.facebook.react.ReactPackage import com.facebook.react.common.annotations.UnstableReactNativeAPI @@ -10,7 +11,6 @@ import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load import com.facebook.react.defaults.DefaultReactHost import com.facebook.react.defaults.DefaultReactNativeHost import com.facebook.react.flipper.ReactNativeFlipper -import com.facebook.react.interfaces.ReactHost import com.facebook.soloader.SoLoader @UnstableReactNativeAPI diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt index 67d39e3d555396..871395ab7449eb 100644 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt @@ -4,6 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ + package com.facebook.react.uiapp import android.app.Application @@ -11,6 +12,7 @@ import com.facebook.fbreact.specs.SampleLegacyModule import com.facebook.fbreact.specs.SampleTurboModule import com.facebook.react.JSEngineResolutionAlgorithm import com.facebook.react.ReactApplication +import com.facebook.react.ReactHost import com.facebook.react.ReactNativeHost import com.facebook.react.ReactPackage import com.facebook.react.TurboReactPackage @@ -25,7 +27,6 @@ import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load import com.facebook.react.defaults.DefaultReactNativeHost import com.facebook.react.fabric.ComponentFactory import com.facebook.react.flipper.ReactNativeFlipper.initializeFlipper -import com.facebook.react.interfaces.ReactHost import com.facebook.react.interfaces.exceptionmanager.ReactJsExceptionHandler import com.facebook.react.module.model.ReactModuleInfo import com.facebook.react.module.model.ReactModuleInfoProvider From c9980fb5bb25d0fb10b571081b5cb40f5f75c2dc Mon Sep 17 00:00:00 2001 From: Christoph Purrer Date: Tue, 10 Oct 2023 17:03:55 -0700 Subject: [PATCH 06/12] Add rn-tester Android BUCK configuration (#39987) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/39987 Changelog: [Internal] Reviewed By: fkgozali Differential Revision: D49983211 fbshipit-source-id: c362d5b93e159bfb5ca17bea0ec0484adcdb4dca --- packages/react-native/ReactCommon/react/bridging/Object.h | 2 +- packages/rn-tester/android/app/build.gradle | 2 ++ packages/rn-tester/android/app/src/main/AndroidManifest.xml | 5 +++++ .../java/com/facebook/react/uiapp/RNTesterApplication.kt | 4 ++-- .../com/facebook/react/uiapp/RNTesterReactHostDelegate.kt | 4 ++-- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/react-native/ReactCommon/react/bridging/Object.h b/packages/react-native/ReactCommon/react/bridging/Object.h index 599b5ceb935788..89e5714b798f0f 100644 --- a/packages/react-native/ReactCommon/react/bridging/Object.h +++ b/packages/react-native/ReactCommon/react/bridging/Object.h @@ -31,7 +31,7 @@ struct Bridging< std::shared_ptr, std::enable_if_t>> { static std::shared_ptr fromJs(jsi::Runtime& rt, const jsi::Object& value) { - return value.asHostObject(rt); + return value.getHostObject(rt); } static jsi::Object toJs(jsi::Runtime& rt, std::shared_ptr value) { diff --git a/packages/rn-tester/android/app/build.gradle b/packages/rn-tester/android/app/build.gradle index b35e80be387c14..20669ea71b1e0e 100644 --- a/packages/rn-tester/android/app/build.gradle +++ b/packages/rn-tester/android/app/build.gradle @@ -146,6 +146,8 @@ android { versionName "1.0" testBuildType System.getProperty('testBuildType', 'debug') // This will later be used to control the test apk build type testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' + buildConfigField("String", "JS_MAIN_MODULE_NAME", "\"js/RNTesterApp.android\"") + buildConfigField("String", "BUNDLE_ASSET_NAME", "\"RNTesterApp.android.bundle\"") } externalNativeBuild { cmake { diff --git a/packages/rn-tester/android/app/src/main/AndroidManifest.xml b/packages/rn-tester/android/app/src/main/AndroidManifest.xml index 7707683c667d0b..2d6ee37ba1b99d 100644 --- a/packages/rn-tester/android/app/src/main/AndroidManifest.xml +++ b/packages/rn-tester/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ + + diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt index 871395ab7449eb..b427b7272d5f5f 100644 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt @@ -43,9 +43,9 @@ class RNTesterApplication : Application(), ReactApplication { throw RuntimeException("Should not use ReactNativeHost when Bridgeless enabled") } object : DefaultReactNativeHost(this) { - public override fun getJSMainModuleName(): String = "js/RNTesterApp.android" + public override fun getJSMainModuleName(): String = BuildConfig.JS_MAIN_MODULE_NAME - public override fun getBundleAssetName(): String = "RNTesterApp.android.bundle" + public override fun getBundleAssetName(): String = BuildConfig.BUNDLE_ASSET_NAME override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.kt b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.kt index b7b2f13ebf086d..5086e8e20bea56 100644 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.kt +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterReactHostDelegate.kt @@ -40,10 +40,10 @@ import com.facebook.react.uimanager.ViewManager class RNTesterReactHostDelegate internal constructor(context: Context) : ReactHostDelegate { var reactHost: ReactHostImpl? = null - override val jsMainModulePath: String = "js/RNTesterApp.android" + override val jsMainModulePath: String = BuildConfig.JS_MAIN_MODULE_NAME override val jsBundleLoader: JSBundleLoader = - JSBundleLoader.createAssetLoader(context, "assets://RNTesterApp.android.bundle", true) + JSBundleLoader.createAssetLoader(context, "assets:" + BuildConfig.BUNDLE_ASSET_NAME, true) @get:Synchronized override val bindingsInstaller: BindingsInstaller? = null From a2ea4208fcf7afe53eda5a72953f9a60e396cca2 Mon Sep 17 00:00:00 2001 From: Lulu Wu Date: Wed, 11 Oct 2023 09:56:27 -0700 Subject: [PATCH 07/12] Add ExceptionsManagerModule for RNTester (#40767) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/40767 Fix the following issue: ```Invariant Violation: TurboModuleRegistry.getEnforcing(...): 'ExceptionsManager' could not be found. Verify that a module by this name is registered in the native binary.Bridgeless mode: true. TurboModule interop: true. Modules loaded: {"NativeModules":[],"TurboModules": ["PlatformConstants","AppState","SourceCode","BlobModule","WebSocketModule","DevSettings","DevToolsSettingsManager","LogBox","Networking","Appearance","DevLoadingView","DeviceInfo","DeviceEventManager", "SoundManager","ImageLoader","DialogManagerAndroid","NativeAnimatedModule","I18nManager","AccessibilityInfo","StatusBarManager","StatusBarManager","IntentAndroid","ToastAndroid","ShareModule","Vibration"], "NotFound":["NativePerformanceCxx","NativePerformanceObserverCxx","RedBox","BugReporting","HeadlessJsTaskSupport","FrameRateLogger","KeyboardObserver", "AccessibilityManager","ModalManager","LinkingManager","ActionSheetManager","ExceptionsManager"]} ``` Changelog: [Android][Changed] - Add Add ExceptionsManagerModule to CoreReactPackage Reviewed By: cortinico Differential Revision: D50017783 fbshipit-source-id: 8642bb23bdae50a1e702f5e0586b0ede80007bb1 --- .../java/com/facebook/react/runtime/CoreReactPackage.java | 5 +++++ .../java/com/facebook/react/uiapp/RNTesterApplication.kt | 3 --- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/CoreReactPackage.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/CoreReactPackage.java index 5ed3e4aa8d1129..7ba138cd6b9654 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/CoreReactPackage.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/CoreReactPackage.java @@ -19,6 +19,7 @@ import com.facebook.react.module.model.ReactModuleInfoProvider; import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; import com.facebook.react.modules.core.DeviceEventManagerModule; +import com.facebook.react.modules.core.ExceptionsManagerModule; import com.facebook.react.modules.debug.DevSettingsModule; import com.facebook.react.modules.debug.SourceCodeModule; import com.facebook.react.modules.deviceinfo.DeviceInfoModule; @@ -36,6 +37,7 @@ SourceCodeModule.class, LogBoxModule.class, DeviceEventManagerModule.class, + ExceptionsManagerModule.class, }) class CoreReactPackage extends TurboReactPackage { @@ -63,6 +65,8 @@ public NativeModule getModule(String name, ReactApplicationContext reactContext) return new DeviceEventManagerModule(reactContext, mHardwareBackBtnHandler); case LogBoxModule.NAME: return new LogBoxModule(reactContext, mDevSupportManager); + case ExceptionsManagerModule.NAME: + return new ExceptionsManagerModule(mDevSupportManager); default: throw new IllegalArgumentException( "In BridgelessReactPackage, could not find Native module for " + name); @@ -85,6 +89,7 @@ public ReactModuleInfoProvider getReactModuleInfoProvider() { DevSettingsModule.class, DeviceEventManagerModule.class, LogBoxModule.class, + ExceptionsManagerModule.class, }; final Map reactModuleInfoMap = new HashMap<>(); for (Class moduleClass : moduleList) { diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt index b427b7272d5f5f..92d4d49ee2380a 100644 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.kt @@ -39,9 +39,6 @@ import com.facebook.soloader.SoLoader class RNTesterApplication : Application(), ReactApplication { override val reactNativeHost: ReactNativeHost by lazy { - if (ReactFeatureFlags.enableBridgelessArchitecture) { - throw RuntimeException("Should not use ReactNativeHost when Bridgeless enabled") - } object : DefaultReactNativeHost(this) { public override fun getJSMainModuleName(): String = BuildConfig.JS_MAIN_MODULE_NAME From 5cacb4f9104b7168081eadec362f004e2d72fed7 Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Mon, 16 Oct 2023 08:20:55 -0700 Subject: [PATCH 08/12] Make sure onIntArrayChanged is invoked on RN Tester (#40940) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/40940 Currently the `onIntArrayChanged` event is invoked only once inside RN Tester. I'm changing the logic to make sure it fires whenever we click "Set Opacity" Changelog: [Internal] [Changed] - Make sure onIntArrayChanged is invoked on RN Tester Reviewed By: mdvacca, dmytrorykun Differential Revision: D50264765 fbshipit-source-id: 93a60fd1b657c3d8b8182cab6bb7cd4368ac9a42 --- .../rn-tester/NativeComponentExample/js/MyNativeView.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/rn-tester/NativeComponentExample/js/MyNativeView.js b/packages/rn-tester/NativeComponentExample/js/MyNativeView.js index c74c0f084e7648..fe32899209e87a 100644 --- a/packages/rn-tester/NativeComponentExample/js/MyNativeView.js +++ b/packages/rn-tester/NativeComponentExample/js/MyNativeView.js @@ -87,6 +87,7 @@ export default function MyNativeView(props: {}): React.Node { const ref = useRef | null>(null); const legacyRef = useRef | null>(null); const [opacity, setOpacity] = useState(1.0); + const [arrayValues, setArrayValues] = useState([1, 2, 3]); const [hsba, setHsba] = useState(new HSBA()); const [cornerRadiusIndex, setCornerRadiusIndex] = useState(0); const [legacyMeasure, setLegacyMeasure] = @@ -102,7 +103,7 @@ export default function MyNativeView(props: {}): React.Node { ref={ref} style={{flex: 1}} opacity={opacity} - values={[0, 1, 2, 3, 4]} + values={arrayValues} onIntArrayChanged={event => { console.log(event.nativeEvent.values); console.log(event.nativeEvent.boolValues); @@ -154,6 +155,11 @@ export default function MyNativeView(props: {}): React.Node { title="Set Opacity" onPress={() => { setOpacity(Math.random()); + setArrayValues([ + Math.floor(Math.random() * 100), + Math.floor(Math.random() * 100), + Math.floor(Math.random() * 100), + ]); }} />