Dans une vraie app
L’installation exige un GestureHandlerRootView à la racine de l’app (le template Expo le pose pour vous), sans quoi les gestes ne répondent pas sur Android, souvent sans aucun message. L’API à utiliser aujourd’hui est celle des hooks de la version 3 (usePanGesture et consorts) avec GestureDetector ; le builder Gesture de la v2 et les anciens composants PanGestureHandler ne sont plus la voie recommandée. Les callbacks (onBegin, onActivate, onUpdate, onDeactivate) suivent la machine à états du geste, et onUpdate est appelé à chaque frame.
Le piège central est la composition avec les scrolls et les navigateurs : un Pan horizontal dans une liste verticale, un geste de retour de la stack native, une ScrollView qui avale le geste. les offsets d’activation et d’échec, simultaneousWith et requireToFail sont les réglages à connaître, et il faut tester sur device Android, dont le comportement de dispatch diffère d’iOS. Un geste qui marche sur simulateur iOS et pas sur Android est le cas d’école.
Avec Reanimated, les callbacks sont des worklets : pas de setState ni de navigation dedans sans scheduleOnRN. Pour vérifier qu’un geste est bien géré nativement, console.log dans onUpdate doit venir du runtime UI, et la fluidité doit tenir pendant qu’un setState lourd tourne sur le thread JS.
Termes liés
Reanimated
La librairie d’animation de Software Mansion qui exécute les animations sur le thread UI via des worklets, sans attendre le thread JavaScript.
Worklet
Une petite fonction JavaScript que le plugin Babel de Reanimated extrait pour l’exécuter sur le thread UI, dans un runtime séparé.
React Navigation
La librairie de navigation de référence de React Native : stack, tabs, drawer, avec des écrans natifs via react-native-screens.
Expo Router
Le routeur d’Expo basé sur les fichiers : chaque fichier du dossier app devient un écran, avec deep links et routes typées automatiques.