diff --git a/android/src/main/java/com/swmansion/rnscreens/Screen.kt b/android/src/main/java/com/swmansion/rnscreens/Screen.kt index 0f91f963fd..b556d115ac 100644 --- a/android/src/main/java/com/swmansion/rnscreens/Screen.kt +++ b/android/src/main/java/com/swmansion/rnscreens/Screen.kt @@ -21,6 +21,9 @@ import com.facebook.react.uimanager.UIManagerModule import com.facebook.react.uimanager.events.EventDispatcher import com.facebook.react.views.scroll.ReactScrollView import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.shape.CornerFamily +import com.google.android.material.shape.MaterialShapeDrawable +import com.google.android.material.shape.ShapeAppearanceModel import com.swmansion.rnscreens.events.HeaderHeightChangeEvent import com.swmansion.rnscreens.events.SheetDetentChangedEvent @@ -54,10 +57,16 @@ class Screen( // Props for controlling modal presentation var isSheetGrabberVisible: Boolean = false + + // corner radius must be updated after all props prop updates from a single transaction + // have been applied, because it depends on the presentation type. + private var shouldUpdateSheetCornerRadius = false var sheetCornerRadius: Float = 0F set(value) { - field = value - (fragment as? ScreenStackFragment)?.onSheetCornerRadiusChange() + if (field != value) { + field = value + shouldUpdateSheetCornerRadius = true + } } var sheetExpandsWhenScrolledToEdge: Boolean = true @@ -420,6 +429,28 @@ class Screen( ) } + internal fun onFinalizePropsUpdate() { + if (shouldUpdateSheetCornerRadius) { + shouldUpdateSheetCornerRadius = false + onSheetCornerRadiusChange() + } + } + + internal fun onSheetCornerRadiusChange() { + if (stackPresentation !== StackPresentation.FORM_SHEET || background == null) { + return + } + (background as MaterialShapeDrawable?)?.let { + it.shapeAppearanceModel = + ShapeAppearanceModel + .Builder() + .apply { + setTopLeftCorner(CornerFamily.ROUNDED, sheetCornerRadius) + setTopRightCorner(CornerFamily.ROUNDED, sheetCornerRadius) + }.build() + } + } + enum class StackPresentation { PUSH, MODAL, diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt index 1c06c7f3a0..7c561d6335 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt @@ -191,13 +191,7 @@ class ScreenStackFragment : } internal fun onSheetCornerRadiusChange() { - (screen.background as MaterialShapeDrawable).shapeAppearanceModel = - ShapeAppearanceModel - .Builder() - .apply { - setTopLeftCorner(CornerFamily.ROUNDED, screen.sheetCornerRadius) - setTopRightCorner(CornerFamily.ROUNDED, screen.sheetCornerRadius) - }.build() + screen.onSheetCornerRadiusChange() } override fun onCreateView( diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt index 2b752266b9..48f82b9511 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt @@ -92,6 +92,12 @@ open class ScreenViewManager : return super.updateState(view, props, stateWrapper) } + // Called after all props are updated for given view + override fun onAfterUpdateTransaction(view: Screen) { + super.onAfterUpdateTransaction(view) + view.onFinalizePropsUpdate() + } + @ReactProp(name = "activityState") fun setActivityState( view: Screen,