Aller au contenu
useffect.sh
Planifier 30 min avec un senior
Performance

FlashList

La liste de Shopify, remplaçante de FlatList : elle recycle les cellules au lieu de les démonter, et la v2 ne demande plus d’estimation de taille.

Définition

FlashList (@shopify/flash-list) est le composant de liste performante de Shopify pour React Native, conçu comme remplaçant direct de FlatList avec la même API de base (data, renderItem, keyExtractor). La différence est dans la stratégie : FlatList, construit sur VirtualizedList, monte et démonte les cellules au fil du défilement, ce qui coûte un rendu React par apparition et produit des zones blanches lors d’un scroll rapide ; FlashList recycle les cellules déjà montées en leur réaffectant de nouvelles données, comme UICollectionView ou RecyclerView. La version 2, écrite pour la New Architecture, abandonne la prop estimatedItemSize et l’auto layout de la v1, active maintainVisibleContentPosition par défaut, et ajoute un mode masonry et un hook useRecyclingState pour réinitialiser l’état local d’une cellule recyclée. Les projets encore sur l’ancienne architecture restent sur la v1. Des cellules blanches pendant un scroll rapide sur un Android milieu de gamme sont en général ce qui y mène.

Dans une vraie app

Le recyclage change une habitude : un composant de cellule reçoit de nouvelles props au lieu d’être recréé, donc tout état local (useState d’un toggle, d’une position de scroll interne) survit au changement d’élément. useRecyclingState existe pour ça, et un key dérivé de l’élément sur un sous-composant est le réflexe à abandonner, puisqu’il annule le bénéfice. Les cellules doivent aussi avoir un type stable : getItemType permet de séparer les pools de recyclage quand une liste mélange plusieurs layouts.

Sur Expo, l’installation ne demande pas de config plugin, et FlashList fonctionne dans Expo Go. Le piège de migration depuis FlatList est la prop estimatedItemSize laissée dans le code (sans effet en v2) et les onLayout par cellule utilisés pour un calcul de position, que le recyclage rend trompeurs. Pour un ajout massif d’éléments en haut de liste (chargement de messages anciens), drawDistance se règle plus haut.

Ce que je mesure avant de recommander un changement : le temps de rendu d’une cellule dans le React Profiler (une cellule lourde reste lente, recyclée ou non), le nombre de rendus par scroll avec « Highlight updates », et la présence de zones blanches en release sur un device milieu de gamme Android. FlashList ne compense pas un renderItem qui fait des calculs ou des require d’images à chaque rendu.

Sources

Les 35 termes du glossaire

Un de ces sujets bloque votre app ?

30 minutes avec un senior pour regarder le problème dans votre code. Gratuit.