La navigation est ce que l'utilisateur touche le plus. Un mauvais choix tue une app, un bon choix la fait oublier. Voici les patterns éprouvés en 2026.
Les trois primitives
- Stack : pile d'écrans avec push/pop. Parcours linéaire profond.
- Tabs : sections parallèles accessibles en permanence. Navigation latérale rapide.
- Drawer : menu latéral pour accès secondaire. Sur le retour en 2026 mais à utiliser avec parcimonie.
Pattern 1 : Tabs + Stack par tab (LE plus courant)
C'est le pattern Instagram, Twitter, la plupart des apps grand public. Chaque onglet a sa propre navigation Stack. Basculer d'onglet conserve l'état de chacun.
// app/(tabs)/_layout.tsx avec expo-router
import { Tabs } from 'expo-router';
export default function TabLayout() {
return (
<Tabs>
<Tabs.Screen name="index" options={{ title: 'Accueil' }} />
<Tabs.Screen name="search" options={{ title: 'Recherche' }} />
<Tabs.Screen name="profile" options={{ title: 'Profil' }} />
</Tabs>
);
}Chaque dossier onglet ((tabs)/index, (tabs)/search, etc.) peut contenir son propre Stack.
Pattern 2 : Modal pour l'action primaire
Sur l'écran principal, un bouton flottant ouvre une modale (création de contenu, composer un message). La modale n'est pas dans la stack principale, elle s'ouvre par-dessus.
// app/modal.tsx
<Stack.Screen
name="create-post"
options={{ presentation: 'modal', animation: 'slide_from_bottom' }}
/>Pattern 3 : Deep linking
Chaque écran doit être adressable. C'est critique pour :
- Partage de lien.
- Notifications push (tap → écran spécifique).
- Réouverture depuis background sur la bonne vue.
expo-router le fait nativement via le file system. Les URLs générées sont claires et stables.
Pattern 4 : Auth flow séparé
Les écrans de login/signup/onboarding sont une stack isolée. Après authentification, on remplace (pas push) la stack par les tabs principaux.
// app/_layout.tsx
if (!isAuthenticated) return <Redirect href="/login" />;
return <Tabs ... />;Pattern de remplacement, pas de push. Sinon le bouton "retour" revient au login — désastre UX.
Les anti-patterns
- Drawer comme navigation principale : cache les features. Les utilisateurs mobiles ne savent pas découvrir un drawer.
- Plus de 5 onglets : illisible sur petit écran. Si vous en avez 6, vous masquez en fait 2 features.
- Stack profond (6+ niveaux) : l'utilisateur se perd. Prévoyez un raccourci vers la racine.
- Back button inconsistent : sur Android, gérez hardwareBackPress explicitement ou vous aurez des bugs.
Mon stack 2026
- React Navigation 7 + expo-router en wrapper.
- react-native-screens natif pour les vraies transitions natives.
- Analytics sur chaque navigation (mesurer l'utilisation réelle des écrans).