From f70abcd14c3b140849ac91b53b8b14b993a433bc Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Thu, 4 Jun 2026 05:43:43 -0700 Subject: [PATCH] Add @Nullable to ScrollView getChildVisibleRect offset parameter Summary: The `offset` parameter in `getChildVisibleRect` overrides was missing the `Nullable` annotation. The Android framework contract for `ViewGroup.getChildVisibleRect(View, Rect, Point)` allows `offset` to be null, and `View.getGlobalVisibleRect(Rect)` legitimately passes null. The `Nullsafe` instrumentation injected a non-null assertion that crashed when null was passed. Changelog: [Android][Fixed] - Fix NullPointerException in ScrollView `getChildVisibleRect` when `offset` is null Reviewed By: javache Differential Revision: D107507935 --- .../react/views/scroll/ReactHorizontalScrollView.java | 4 +++- .../facebook/react/views/scroll/ReactNestedScrollView.java | 6 ++++-- .../com/facebook/react/views/scroll/ReactScrollView.java | 4 +++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java index a153bea92bb4..0c0bdc21368f 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java @@ -15,6 +15,7 @@ import android.animation.ObjectAnimator; import android.animation.ValueAnimator; +import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; @@ -1054,7 +1055,8 @@ public void getClippingRect(Rect outClippingRect) { } @Override - public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { + @SuppressLint("NullsafeMismatch") + public boolean getChildVisibleRect(View child, Rect r, @Nullable android.graphics.Point offset) { return super.getChildVisibleRect(child, r, offset); } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactNestedScrollView.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactNestedScrollView.java index 02a05589d36d..ca260b55b4fb 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactNestedScrollView.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactNestedScrollView.java @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<73693667f092b5c8a9f5b10c479e8174>> */ /** @@ -23,6 +23,7 @@ import android.animation.ObjectAnimator; import android.animation.ValueAnimator; +import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; @@ -807,7 +808,8 @@ public void getClippingRect(Rect outClippingRect) { } @Override - public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { + @SuppressLint("NullsafeMismatch") + public boolean getChildVisibleRect(View child, Rect r, @Nullable android.graphics.Point offset) { return super.getChildVisibleRect(child, r, offset); } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java index 1d3c03da6ef3..6fc765c4e31d 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java @@ -15,6 +15,7 @@ import android.animation.ObjectAnimator; import android.animation.ValueAnimator; +import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; @@ -799,7 +800,8 @@ public void getClippingRect(Rect outClippingRect) { } @Override - public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { + @SuppressLint("NullsafeMismatch") + public boolean getChildVisibleRect(View child, Rect r, @Nullable android.graphics.Point offset) { return super.getChildVisibleRect(child, r, offset); }