In a real app
Recycling changes a habit: a cell component receives new props instead of being recreated, so any local state (a useState for a toggle, an internal scroll position) survives the item change. useRecyclingState exists for that, and an item-derived key on a sub-component is the reflex to drop, since it cancels the benefit. Cells also need a stable type: getItemType separates recycling pools when a list mixes several layouts.
On Expo, the install needs no config plugin and FlashList works in Expo Go. The migration pitfall from FlatList is the estimatedItemSize prop left in the code (ignored in v2) and per-cell onLayout callbacks used for position math, which recycling makes misleading. For bulk inserts at the top of the list (loading older messages), drawDistance goes up.
What I measure before recommending a switch: a cell’s render time in the React Profiler (a heavy cell stays slow, recycled or not), renders per scroll with “Highlight updates”, and blank areas in release on a mid-range Android device. FlashList does not make up for a renderItem that computes or requires images on every render.
Related terms
New Architecture
The rewrite of React Native internals (Fabric, Turbo Modules, JSI), on by default since 0.76 and the only architecture since 0.82.
Fabric
The New Architecture renderer: a C++ core shared by iOS and Android that computes layout synchronously.
Reanimated
Software Mansion’s animation library that runs animations on the UI thread through worklets, without waiting on the JavaScript thread.
Cold start (startup time)
Launching the app from scratch, process included: native init, bundle load, first React render, up to a usable screen (TTI).