Repository navigation
Fabric: inverted FlatList renders nothing at rest on device (iOS 27); content paints only during navigation transitions #59731
Description
Description
On a physical iOS device (iPhone 16 Pro, iOS 27.0.1) with the New Architecture (Fabric), an inverted FlatList stops painting at rest: the screen goes blank even though the list is fully functional underneath. Content becomes visible again while an interactive navigation transition is animating, and disappears the moment the screen settles.
With inverted={false} (data order unchanged), the exact same list renders correctly, which isolates the failure to the inversion path.
Observations from an instrumented session
onContentSizeChangereports a correct content size (e.g.contentSize=2994,layout=874) andonScrollfires with valid offsets while the screen is blank — layout, virtualization and gesture handling all work; only painting is gone.- A scrollbar is visible in the blank state, i.e. the scroll extent exists but no cells paint.
- During a
UINavigationController-style push/pop transition (react-native-screens / expo-router native stack), the full transcript paints; it vanishes as soon as the transition settles. - Removing
inverted(keeping everything else, includingmaintainVisibleContentPosition) fixes it completely. - Removing
removeClippedSubviewsand/ormaintainVisibleContentPositionfrom the inverted list does not help, so it is not an interaction with those props. - Data layer verified independently (store contents, page sizes constant across the blank state) — this is purely a rendering/compositing failure.
The list configuration (real-world chat transcript)
<FlatList
inverted
data={rows}
keyExtractor={key}
renderItem={renderRow}
ListHeaderComponent={…} // live run / pending prompts
ListFooterComponent={…} // older-page spinner
onEndReached={loadOlder}
onEndReachedThreshold={1}
maintainVisibleContentPosition={{ minIndexForVisible: 0, autoscrollToTopThreshold: 240 }}
contentContainerStyle={{ paddingTop: dockHeight, paddingBottom: headerHeight }}
keyboardDismissMode="interactive"
keyboardShouldPersistTaps="handled"
initialNumToRender={10}
maxToRenderPerBatch={8}
windowSize={9}
/>Steps to reproduce
- Run an app with the FlatList above on a physical iOS 27 device with the New Architecture (observed with Expo SDK 58 / RN 0.88.0, expo-router native-stack screen).
- Push the screen containing the inverted list.
- Once the push transition settles, the list area is blank (scrollbar still visible). Re-entering the screen shows the content only during the transition animation.
- Change
invertedtofalse(or remove the prop): content paints and stays painted.
No Snack is attached because the failure only reproduces on a physical device so far; happy to collect more diagnostics (view-hierarchy dumps, systrace) on request.
Workaround
Render the list non-inverted in chronological order and let maintainVisibleContentPosition={{ minIndexForVisible: 0, autoscrollToTopThreshold: N }} handle anchoring, with an explicit scrollToEnd on first layout. This restores the full chat behaviour.
Environment
react-native: 0.88.0 (New Architecture, Fabric)
expo: ~58.0.19 (expo-router native-stack)
react: 19.3.0
Platform: iOS 27.0.1, iPhone 16 Pro (physical device)
Activity
react-native-bot commentedon Nov 1, 2026
Warning
Missing reproducer: We could not detect a reproducible example in your issue report. Reproducers are mandatory and we can accept only one of those as a valid reproducer:
You can read more about about it on our website: How to report a bug.
Reproduce inverted FlatList blank at rest on iOS 27 device (react#59731)
zj-linjie commentedon Nov 1, 2026
Reproducer PR: #59732 (RNTesterPlayground, verified on iPhone 16 Pro / iOS 27.0.1 / RN 0.88.0 with Fabric — with
invertedon, the bare list paints nothing at rest; toggling the switch renders it).