Stack Navigator: ce este, navigarea pe stivă în React Native

Autor: IT Sectr Publicat: 2026-02-22 Timp de citire: 11 min

Stack Navigator — component al bibliotecii React Navigation pentru gestionarea ecranelor aplicației mobile pe principiul stivei (LIFO). Fiecare ecran nou este plasat peste cel anterior, iar butonul «Înapoi» elimină ecranul de sus și readuce utilizatorul la cel anterior. Mai multe despre arhitectura navigării citiți în documentația oficială React Navigation.

Puncte principale

  • Stack Navigator — component React Navigation pentru gestionarea ecranelor pe principiul stivei (LIFO)
  • Navigarea pe stivă — fiecare ecran este așezat peste cel anterior; butonul «Înapoi» șterge ecranul curent
  • Native Stack — implementare nativă prin UINavigationController (iOS) și Fragment (Android)
  • Animații — tranziții integrate (slide, fade, none) și animații personalizate prin cardStyleInterpolator
  • TypeScript — tipizare completă a parametrilor de navigare prin RootStackParamList

Ce este Stack Navigator?

Stack Navigator — unul dintre navigatorii de bază ai bibliotecii React Navigation, care implementează modelul de stivă al ecranelor. Oferă o navigare familiară pentru utilizatorii de mobile: deschiderea unui ecran nou este însoțită de o animație de intrare din dreapta, iar butonul «Înapoi» sau gestul de glisare readuce utilizatorul la ecranul anterior. Stack Navigator este suportat pe iOS și Android, folosind componente native ale platformei pentru performanță maximă.

React Navigation este cea mai populară bibliotecă de navigare pentru React Native, instalată în 85% din proiecte (conform datelor npm, 2026). Stack Navigator face parte din nucleul său și este disponibil în două implementări: createNativeStackNavigator (nativă, recomandată) și createStackNavigator (JavaScript, pentru animații personalizate complexe). Versiunea nativă a apărut în React Navigation v5 și a devenit standard în v6+.

Principalul avantaj al Stack Navigator — comportament natural, familiar utilizatorilor iOS și Android. Pe iOS, stiva este reprezentată vizual prin UINavigationController, pe Android — prin FragmentManager cu animație slide. Dezvoltatorul nu trebuie să implementeze manual logica stivei — navigatorul gestionează stările ecranelor, back stack și animațiile automat.

Cum funcționează navigarea pe stivă

Navigarea pe stivă se bazează pe principiul LIFO (Last In, First Out). Când utilizatorul deschide un ecran nou, navigatorul îl plasează în vârful stivei. La apăsarea «Înapoi», ecranul de sus este eliminat, iar utilizatorul vede ecranul anterior. Stiva poate conține orice număr de ecrane — limitarea este doar memoria dispozitivului.

Fiecare ecran din stivă își păstrează starea. La revenirea la ecranul anterior, starea acestuia se restabilește automat. Aceasta deosebește stiva de alte tipuri de navigare (Tab, Drawer), unde ecranele pot fi recreate. React Navigation gestionează starea prin propriul mecanism de context de navigare.

AcțiuneRezultatExemplu
navigatePlasează ecranul în vârful stiveinavigation.navigate('Profile')
goBackElimină ecranul de sus din stivănavigation.goBack()
pushAdaugă forțat un ecran nounavigation.push('Profile')
popToTopReaduce la ecranul rădăcinănavigation.popToTop()
resetÎnlocuiește întreaga stivă cu un set nounavigation.reset({ index: 0, routes: [...] })

Gestul de glisare pentru revenire

Pe iOS, Stack Navigator suportă gestul de glisare de la marginea stângă a ecranului pentru revenire — acesta este comportamentul standard iOS pe care utilizatorii îl așteaptă. Pe Android, gestul este dezactivat implicit, dar poate fi activat prin opțiunea gestureEnabled. În Native Stack, gestul funcționează nativ, fără întârzieri ale firului JavaScript.

Native Stack vs JS Stack

React Navigation oferă două tipuri de Stack Navigator: Native Stack (createNativeStackNavigator) și JS Stack (createStackNavigator). Diferența principală este locul de execuție al animației. Native Stack folosește driverele native de animație iOS și Android, în timp ce JS Stack funcționează prin firul JavaScript al React Native. Alegerea între ele depinde de cerințele de performanță și personalizare.

Native Stack este recomandat pentru majoritatea proiectelor. Asigură animații fluide de 60 FPS fără blocarea firului JS, suportă gestul sistem de glisare pe iOS și folosește tranziții native — slide pe iOS, fade pe Android. Cu toate acestea, Native Stack este limitat în personalizarea animațiilor: este disponibil doar un set predefinit de tranziții.

JS Stack oferă control complet asupra animațiilor prin cardStyleInterpolator. Dezvoltatorul poate crea orice animație: scalare, rotație, paralaxă, curbe personalizate. Dezavantaj — animațiile rulează în firul JS, ceea ce poate cauza căderi de cadre pe dispozitive slabe la tranziții complexe. Pentru 70% din proiecte, Native Stack este suficient.

typescript
// Native Stack — implementare recomandată
import { createNativeStackNavigator } from '@react-navigation/native-stack';

type RootStackParamList = {
  Home: undefined;
  Profile: { userId: string; name: string };
  Settings: undefined;
};

const Stack = createNativeStackNavigator<RootStackParamList>();

function AppNavigator() {
  return (
    <Stack.Navigator screenOptions={{ headerShown: true }}>
      <Stack.Screen name="Home" component={HomeScreen} />
      <Stack.Screen name="Profile" component={ProfileScreen} />
      <Stack.Screen name="Settings" component={SettingsScreen} />
    </Stack.Navigator>
  );
}

Instalarea și configurarea Stack Navigator

Pentru a începe lucrul cu Stack Navigator trebuie instalat React Navigation și dependențele sale. Setul minim include @react-navigation/native, @react-navigation/native-stack și react-native-screens. După instalare, aplicația este înfășurată în NavigationContainer — context care furnizează starea de navigare tuturor componentelor copil.

bash
# Instalarea dependențelor React Navigation
npm install @react-navigation/native @react-navigation/native-stack
npm install react-native-screens react-native-safe-area-context

# Pentru iOS — instalarea pod
cd ios && pod install && cd ..

După instalare, se creează Stack.Navigator cu ecrane definite în RootStackParamList. Fiecare ecran este legat de o componentă React prin prop-ul component. Navigatorul poate fi rădăcină sau imbricat într-un alt navigator (Tab, Drawer). Pentru configurare se folosesc screenOptions — comune pentru toate ecranele sau individuale pentru fiecare.

typescript
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';

type RootStackParamList = {
  Home: undefined;
  Details: { itemId: number; title: string };
};

const Stack = createNativeStackNavigator<RootStackParamList>();

export default function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator initialRouteName="Home"
        screenOptions={{
          headerStyle: { backgroundColor: '#6200ee' },
          headerTintColor: '#fff',
          gestureEnabled: true,
        }}>
        <Stack.Screen name="Home" component={HomeScreen}
          options={{ title: 'Acasă' }} />
        <Stack.Screen name="Details" component={DetailsScreen}
          options={({ route }) => ({ title: route.params.title })} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

Parametrii și personalizarea Stack Navigator

Stack Navigator oferă numeroase opțiuni pentru personalizarea aspectului și comportamentului. Parametrii principali se setează prin screenOptions la nivel de Navigator sau options la nivel de Screen. Dezvoltatorul poate configura titlul, animația de tranziție, gestul de glisare, stilul cardului și întunecarea fundalului. Flexibilitatea setărilor permite adaptarea navigării la sistemul de design al aplicației.

OpțiuneTipDescriere
headerShownbooleanAfișează sau ascunde titlul ecranului
headerStyleobjectStilul panoului de titlu (backgroundColor, elevation)
headerBackTitlestringTextul butonului «Înapoi» (iOS)
gestureEnabledbooleanActivează gestul de glisare pentru revenire
animationstringTipul de animație: slide_from_right, fade, none
contentStyleobjectStilul zonei interne a ecranului

Animații personalizate prin cardStyleInterpolator

Pentru JS Stack, cardStyleInterpolator permite crearea de animații arbitrare de tranziție între ecrane. Este un instrument puternic pentru implementarea efectelor vizuale unice: scalare, rotație, paralaxă, flip orizontal. Funcția primește valorile curente de progres ale animației (current, next) și returnează stiluri pentru elementele animate.

Tipizarea navigării cu TypeScript

Stack Navigator suportă tipizarea completă prin TypeScript. Pentru aceasta se definește RootStackParamList — un tip-obiect în care cheile sunt numele ecranelor, iar valorile sunt tipurile de parametri. După tipizare, navigation.navigate și route.params primesc autocompletare și verificare de tip. Aceasta elimină erorile de transmitere a parametrilor în faza de compilare.

typescript
type RootStackParamList = {
  Home: undefined;
  Product: { id: string; category: string };
  Checkout: { items: CartItem[]; total: number };
};

// Ecran tipizat
type ProductScreenProps = NativeStackScreenProps<RootStackParamList, 'Product'>;

function ProductScreen({ navigation, route }: ProductScreenProps) {
  const { id, category } = route.params;

  return (
    <View>
      <Text>Produsul {id} — {category}</Text>
      <Button title="În coș"
        onPress={() => navigation.navigate('Checkout', {
          items: [{ id, quantity: 1 }],
          total: 99.99,
        })} />
    </View>
  );
}

Scenarii avansate: ferestre modale și grupuri

Stack Navigator suportă gruparea ecranelor și ferestrele modale. Grupurile (Screen Group) permit aplicarea de setări comune mai multor ecrane fără duplicare. Ferestrele modale se implementează prin stack presentation: 'modal' — ecranul se deschide de jos cu întunecarea fundalului, ca un modal sistemic pe iOS. Această opțiune este disponibilă doar în Native Stack.

Pentru navigarea complexă, Stack Navigator poate fi imbricat în Tab Navigator sau Drawer Navigator. De exemplu, fila «Acasă» conține propria stivă de ecrane, iar fila «Profil» — pe a sa. O astfel de compoziție de navigatori este abordarea standard pentru aplicațiile de producție. Fiecare stivă este izolată: back stack-ul din interiorul unei file nu afectează celelalte file.

typescript
// Stivă imbricată în Tab Navigator
const HomeStack = createNativeStackNavigator<HomeStackParamList>();

function HomeStackScreen() {
  return (
    <HomeStack.Navigator>
      <HomeStack.Screen name="Feed" component={FeedScreen} />
      <HomeStack.Screen name="PostDetail" component={PostDetailScreen}
        options={{ presentation: 'modal' }} />
    </HomeStack.Navigator>
  );
}

// Grupuri de ecrane cu opțiuni comune
<Stack.Navigator>
  <Stack.Group screenOptions={{ headerShown: true }}>
    <Stack.Screen name="Main" component={MainScreen} />
    <Stack.Screen name="About" component={AboutScreen} />
  </Stack.Group>
  <Stack.Screen name="Auth" component={AuthScreen}
    options={{ presentation: 'modal', headerShown: false }} />
</Stack.Navigator>

Întrebări frecvente

Care este diferența dintre navigate și push în Stack Navigator?

navigate caută mai întâi un ecran existent cu acest nume în stivă și navighează la el dacă este găsit. push adaugă întotdeauna un ecran nou în vârful stivei, chiar dacă unul similar există deja. push este util când trebuie să deschideți același ecran cu date diferite (de exemplu, profilul utilizatorului).

Cum se transmit parametrii către un ecran în Stack Navigator?

Parametrii se transmit ca al doilea argument al metodei navigate: navigation.navigate('Profile', { userId: '123', name: 'John' }). Pe ecranul destinatar, parametrii sunt accesibili prin route.params. Tipurile de parametri se definesc în RootStackParamList pentru autocompletare în TypeScript.

Stack Navigator sau Tab Navigator — ce să alegem?

Stack Navigator este potrivit pentru navigarea liniară (ecran → detalii → editare). Tab Navigator — pentru secțiuni paralele ale aplicației (Acasă, Căutare, Profil). În proiectele de producție, ele se combină: Tab Navigator conține mai multe instanțe Stack Navigator pentru fiecare filă.

Cum funcționează butonul «Înapoi» în Stack Navigator?

Implicit, Stack Navigator adaugă un buton «Înapoi» în titlul pentru toate ecranele, cu excepția ecranului rădăcină. Pe iOS funcționează și gestul de glisare de la marginea stângă. Metoda navigation.goBack() elimină ecranul curent din stivă și readuce utilizatorul la ecranul anterior.

Se poate personaliza complet animația în Stack Navigator?

În Native Stack sunt disponibile animații predefinite: slide_from_right, fade, none. Pentru personalizare completă se folosește JS Stack cu cardStyleInterpolator — o funcție care returnează stilurile cardului la fiecare cadru al animației. Aceasta permite crearea oricăror tranziții: scalare, paralaxă, rotație 3D.

Rezumat

  • Stack Navigator — component React Navigation pentru gestionarea ecranelor pe principiul LIFO cu performanță nativă
  • Native Stack (createNativeStackNavigator) folosește animațiile native iOS și Android și este recomandat pentru 85% din proiecte
  • RootStackParamList asigură tipizarea completă a parametrilor de navigare în TypeScript
  • Screen options permit configurarea titlului, animațiilor, gesturilor și stilului fiecărui ecran
  • Grupurile și modalele — mecanisme integrate pentru organizarea ecranelor conexe și a ferestrelor modale
  • Compoziția navigatoarelor — Stack Navigator este imbricat în Tab/Drawer pentru arhitectura de producție
  • JS Stack oferă control complet asupra animațiilor prin cardStyleInterpolator pentru tranziții unice

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și