Skip to content

Commit 1604232

Browse files
yungstersfacebook-github-bot
authored andcommitted
VirtualView: Create Experimental Feature Flag (#53533)
Summary: Pull Request resolved: #53533 Creates a new `enableVirtualViewExperimental` feature flag that determines whether `VirtualView` uses the old or new implementation. Changelog: [Internal] Reviewed By: lunaleaps Differential Revision: D81340963 fbshipit-source-id: f550fe4e4573e080eb8668077d0ad3ca53cd4d33
1 parent c1320eb commit 1604232

3 files changed

Lines changed: 29 additions & 23 deletions

File tree

packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -839,6 +839,16 @@ const definitions: FeatureFlagDefinitions = {
839839
},
840840
ossReleaseStage: 'stable',
841841
},
842+
enableVirtualViewExperimental: {
843+
defaultValue: false,
844+
metadata: {
845+
dateAdded: '2025-08-29',
846+
description: 'Enables the experimental version of `VirtualView`.',
847+
expectedReleaseValue: true,
848+
purpose: 'experimentation',
849+
},
850+
ossReleaseStage: 'none',
851+
},
842852
fixVirtualizeListCollapseWindowSize: {
843853
defaultValue: false,
844854
metadata: {

packages/react-native/src/private/components/virtualview/VirtualView.js

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import type {NativeModeChangeEvent} from './VirtualViewNativeComponent';
1616
import StyleSheet from '../../../../Libraries/StyleSheet/StyleSheet';
1717
import * as ReactNativeFeatureFlags from '../../featureflags/ReactNativeFeatureFlags';
1818
import VirtualViewExperimentalNativeComponent from './VirtualViewExperimentalNativeComponent';
19-
import VirtualViewNativeComponent from './VirtualViewNativeComponent';
19+
import VirtualViewClassicNativeComponent from './VirtualViewNativeComponent';
2020
import nullthrows from 'nullthrows';
2121
import * as React from 'react';
2222
// $FlowFixMe[missing-export]
@@ -49,6 +49,11 @@ export type ModeChangeEvent = $ReadOnly<{
4949
target: HostInstance,
5050
}>;
5151

52+
const VirtualViewNativeComponent: typeof VirtualViewClassicNativeComponent =
53+
ReactNativeFeatureFlags.enableVirtualViewExperimental()
54+
? VirtualViewExperimentalNativeComponent
55+
: VirtualViewClassicNativeComponent;
56+
5257
type VirtualViewComponent = component(
5358
children?: React.Node,
5459
nativeID?: string,
@@ -63,16 +68,9 @@ const NotHidden = null;
6368

6469
type State = HiddenHeight | typeof NotHidden;
6570

66-
function createVirtualView(
67-
initialState: State,
68-
experimental: boolean,
69-
): VirtualViewComponent {
71+
function createVirtualView(initialState: State): VirtualViewComponent {
7072
const initialHidden = initialState !== NotHidden;
7173

72-
const NativeComponent = experimental
73-
? VirtualViewExperimentalNativeComponent
74-
: VirtualViewNativeComponent;
75-
7674
component VirtualView(
7775
children?: React.Node,
7876
nativeID?: string,
@@ -124,7 +122,7 @@ function createVirtualView(
124122
};
125123

126124
return (
127-
<NativeComponent
125+
<VirtualViewNativeComponent
128126
initialHidden={initialHidden}
129127
nativeID={nativeID}
130128
ref={ref}
@@ -153,24 +151,16 @@ function createVirtualView(
153151
'no-activity' | _ => isHidden ? null : children,
154152
}
155153
}
156-
</NativeComponent>
154+
</VirtualViewNativeComponent>
157155
);
158156
}
159157
return VirtualView;
160158
}
161159

162-
export default createVirtualView(NotHidden, false) as VirtualViewComponent;
163-
164-
export const VirtualViewExperimental = createVirtualView(
165-
NotHidden,
166-
true,
167-
) as VirtualViewComponent;
160+
export default createVirtualView(NotHidden) as VirtualViewComponent;
168161

169-
export function createHiddenVirtualView(
170-
height: number,
171-
experimental: boolean,
172-
): VirtualViewComponent {
173-
return createVirtualView(height as HiddenHeight, experimental);
162+
export function createHiddenVirtualView(height: number): VirtualViewComponent {
163+
return createVirtualView(height as HiddenHeight);
174164
}
175165

176166
export const _logs: {states?: Array<State>} = {};

packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<8ac45d7dfef86becd1f0a7ec7ba8e999>>
7+
* @generated SignedSource<<22523248acc3e378f3f81ef43406f106>>
88
* @flow strict
99
* @noformat
1010
*/
@@ -34,6 +34,7 @@ export type ReactNativeFeatureFlagsJsOnly = $ReadOnly<{
3434
deferFlatListFocusChangeRenderUpdate: Getter<boolean>,
3535
disableMaintainVisibleContentPosition: Getter<boolean>,
3636
enableAccessToHostTreeInFabric: Getter<boolean>,
37+
enableVirtualViewExperimental: Getter<boolean>,
3738
fixVirtualizeListCollapseWindowSize: Getter<boolean>,
3839
isLayoutAnimationEnabled: Getter<boolean>,
3940
reduceDefaultPropsInImage: Getter<boolean>,
@@ -150,6 +151,11 @@ export const disableMaintainVisibleContentPosition: Getter<boolean> = createJava
150151
*/
151152
export const enableAccessToHostTreeInFabric: Getter<boolean> = createJavaScriptFlagGetter('enableAccessToHostTreeInFabric', true);
152153

154+
/**
155+
* Enables the experimental version of `VirtualView`.
156+
*/
157+
export const enableVirtualViewExperimental: Getter<boolean> = createJavaScriptFlagGetter('enableVirtualViewExperimental', false);
158+
153159
/**
154160
* Fixing an edge case where the current window size is not properly calculated with fast scrolling. Window size collapsed to 1 element even if windowSize more than the current amount of elements
155161
*/

0 commit comments

Comments
 (0)