diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt index 3533ea493c..656108921a 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt @@ -204,6 +204,13 @@ class ScreenStackHeaderConfigViewManager : config.setDirection(direction) } + // unstable_synchronousUpdatesEnabled is not available on Android atm, + // however we must override their setters + override fun setUnstable_synchronousUpdatesEnabled( + config: ScreenStackHeaderConfig?, + value: Boolean, + ) = Unit + override fun getExportedCustomDirectEventTypeConstants(): Map = hashMapOf( HeaderAttachedEvent.EVENT_NAME to hashMapOf("registrationName" to "onAttached"), diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt index b48a9762bb..54efb256ba 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt @@ -41,6 +41,13 @@ class ScreenStackHeaderSubviewManager : } } + // unstable_synchronousUpdatesEnabled is not available on Android atm, + // however we must override their setters + override fun setUnstable_synchronousUpdatesEnabled( + view: ScreenStackHeaderSubview?, + value: Boolean, + ) = Unit + override fun updateState( view: ScreenStackHeaderSubview, props: ReactStylesDiffMap?, diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt index 8453188768..2c9d32332c 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt @@ -268,6 +268,7 @@ open class ScreenViewManager : view?.sheetElevation = value.toFloat() } + // mark: iOS-only // these props are not available on Android, however we must override their setters override fun setFullScreenSwipeEnabled( view: Screen?, @@ -334,6 +335,13 @@ open class ScreenViewManager : value: String?, ) = Unit + override fun setUnstable_synchronousUpdatesEnabled( + view: Screen?, + value: Boolean, + ) = Unit + + // END mark: iOS-only + @ReactProp(name = "sheetAllowedDetents") override fun setSheetAllowedDetents( view: Screen, diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java index 1026d0c0d9..206a7bc7e9 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java @@ -134,6 +134,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "topScrollEdgeEffect": mViewManager.setTopScrollEdgeEffect(view, (String) value); break; + case "unstable_synchronousUpdatesEnabled": + mViewManager.setUnstable_synchronousUpdatesEnabled(view, value == null ? false : (boolean) value); + break; default: super.setProperty(view, propName, value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java index 80a3346116..10288fbb66 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java @@ -52,4 +52,5 @@ public interface RNSScreenManagerInterface { void setLeftScrollEdgeEffect(T view, @Nullable String value); void setRightScrollEdgeEffect(T view, @Nullable String value); void setTopScrollEdgeEffect(T view, @Nullable String value); + void setUnstable_synchronousUpdatesEnabled(T view, boolean value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java index d59f9b4bb4..88ac5cac5e 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java @@ -108,6 +108,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "topInsetEnabled": mViewManager.setTopInsetEnabled(view, value == null ? false : (boolean) value); break; + case "unstable_synchronousUpdatesEnabled": + mViewManager.setUnstable_synchronousUpdatesEnabled(view, value == null ? false : (boolean) value); + break; default: super.setProperty(view, propName, value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java index 446043698a..996a61735d 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java @@ -42,4 +42,5 @@ public interface RNSScreenStackHeaderConfigManagerInterface { void setBackButtonInCustomView(T view, boolean value); void setBlurEffect(T view, @Nullable String value); void setTopInsetEnabled(T view, boolean value); + void setUnstable_synchronousUpdatesEnabled(T view, boolean value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java index 439ead9b8d..da062922f3 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java @@ -26,6 +26,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "type": mViewManager.setType(view, (String) value); break; + case "unstable_synchronousUpdatesEnabled": + mViewManager.setUnstable_synchronousUpdatesEnabled(view, value == null ? false : (boolean) value); + break; default: super.setProperty(view, propName, value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java index dc320ad032..108e520f90 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java @@ -15,4 +15,5 @@ public interface RNSScreenStackHeaderSubviewManagerInterface { void setType(T view, @Nullable String value); + void setUnstable_synchronousUpdatesEnabled(T view, boolean value); } diff --git a/apps/src/tests/Test3282.tsx b/apps/src/tests/Test3282.tsx new file mode 100644 index 0000000000..5092591b9c --- /dev/null +++ b/apps/src/tests/Test3282.tsx @@ -0,0 +1,98 @@ +import React, { useEffect } from 'react'; +import { View, Text, Button, StyleSheet } from 'react-native'; +import { NavigationContainer } from '@react-navigation/native'; +import { createNativeStackNavigator, NativeStackNavigationProp } from '@react-navigation/native-stack'; +import { featureFlags } from 'react-native-screens'; + +const SYNCHRONOUS_STATE_UPDATES_ENABLED = true; + +type StackParamList = { + Home: undefined, + FormSheet: undefined, +} + +type RouteProps = { + navigation: NativeStackNavigationProp; +} + +const Stack = createNativeStackNavigator(); + +const HomeScreen = ({ navigation }: RouteProps) => { + useEffect(() => { + featureFlags.experiment.unstable_synchronousStateUpdatesEnabled = SYNCHRONOUS_STATE_UPDATES_ENABLED + }, []) + + return ( + +