Skip to content

Fabric: inverted FlatList renders nothing at rest on device (iOS 27); content paints only during navigation transitions #59731

Open

Description

@zj-linjie

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

  • onContentSizeChange reports a correct content size (e.g. contentSize=2994, layout=874) and onScroll fires 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, including maintainVisibleContentPosition) fixes it completely.
  • Removing removeClippedSubviews and/or maintainVisibleContentPosition from 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

  1. 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).
  2. Push the screen containing the inverted list.
  3. 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.
  4. Change inverted to false (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

  1. react-native-bot commented on Nov 1, 2026

    @react-native-bot
    Collaborator

    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.

  2. zj-linjie commented on Nov 1, 2026

    @zj-linjie
    Author

    Reproducer PR: #59732 (RNTesterPlayground, verified on iPhone 16 Pro / iOS 27.0.1 / RN 0.88.0 with Fabric — with inverted on, the bare list paints nothing at rest; toggling the switch renders it).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Needs: AttentionIssues where the author has responded to feedback.Needs: ReproThis issue could be improved with a clear list of steps to reproduce the issue.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions