Stack Navigator: cos'è, navigazione a pila in React Native

Autore: IT Sectr Pubblicato: 2026-02-22 Tempo di lettura: 11 min

Stack Navigator — un componente della libreria React Navigation per gestire gli schermi delle applicazioni mobili secondo il principio di pila (LIFO). Ogni nuovo schermo viene posizionato sopra il precedente e il pulsante «Indietro» rimuove lo schermo superiore e riporta l'utente a quello precedente. Ulteriori informazioni sull'architettura di navigazione nella documentazione ufficiale di React Navigation.

Punti chiave

  • Stack Navigator — componente React Navigation per gestire gli schermi secondo il principio di pila (LIFO)
  • Navigazione a pila — ogni schermo viene posizionato sopra il precedente; il pulsante «Indietro» rimuove lo schermo corrente
  • Native Stack — implementazione nativa tramite UINavigationController (iOS) e Fragment (Android)
  • Animazioni — transizioni integrate (slide, fade, none) e animazioni personalizzate tramite cardStyleInterpolator
  • TypeScript — tipizzazione completa dei parametri di navigazione tramite RootStackParamList

Cos'è Stack Navigator?

Stack Navigator — uno dei navigatori di base della libreria React Navigation che implementa il modello a pila di schermi. Fornisce la navigazione familiare agli utenti mobili: l'apertura di un nuovo schermo è accompagnata da un'animazione di scorrimento verso destra e il pulsante «Indietro» o il gesto di scorrimento riporta l'utente allo schermo precedente. Stack Navigator supporta iOS e Android, utilizzando componenti nativi della piattaforma per le massime prestazioni.

React Navigation è la libreria di navigazione più popolare per React Native, installata nell'85% dei progetti (secondo i dati npm, 2026). Stack Navigator fa parte del suo nucleo ed è disponibile in due implementazioni: createNativeStackNavigator (nativa, consigliata) e createStackNavigator (JavaScript, per animazioni personalizzate complesse). La versione nativa è apparsa in React Navigation v5 ed è diventata lo standard in v6+.

Il vantaggio principale di Stack Navigator — il comportamento naturale familiare agli utenti di iOS e Android. Su iOS, la pila è rappresentata visivamente da UINavigationController, su Android — da FragmentManager con animazione di scorrimento. Lo sviluppatore non deve implementare manualmente la logica della pila — il navigatore gestisce automaticamente gli stati degli schermi, la pila di ritorno e le animazioni.

Come funziona la navigazione a pila

La navigazione a pila si basa sul principio LIFO (Last In, First Out). Quando un utente apre un nuovo schermo, il navigatore lo posiziona in cima alla pila. Premendo «Indietro», lo schermo superiore viene rimosso e l'utente vede quello precedente. La pila può contenere un numero qualsiasi di schermi — l'unico limite è la memoria del dispositivo.

Ogni schermo nella pila conserva il suo stato. Tornando a uno schermo precedente, il suo stato viene ripristinato automaticamente. Questo distingue la pila da altri tipi di navigazione (Tab, Drawer), dove gli schermi possono essere ricreati. React Navigation gestisce lo stato attraverso il proprio meccanismo di contesto di navigazione.

AzioneRisultatoEsempio
navigatePosiziona uno schermo in cima alla pilanavigation.navigate('Profile')
goBackRimuove lo schermo superiore dalla pilanavigation.goBack()
pushAggiunge forzatamente un nuovo schermonavigation.push('Profile')
popToTopTorna allo schermo radicenavigation.popToTop()
resetSostituisce l'intera pila con un nuovo insiemenavigation.reset({ index: 0, routes: [...] })

Gesto di scorrimento per tornare indietro

Su iOS, Stack Navigator supporta un gesto di scorrimento dal bordo sinistro per tornare indietro — questo è il comportamento standard di iOS che gli utenti si aspettano. Su Android, il gesto è disattivato per impostazione predefinita, ma può essere attivato tramite l'opzione gestureEnabled. In Native Stack, il gesto funziona nativamente senza ritardi del thread JavaScript.

Native Stack vs JS Stack

React Navigation offre due tipi di Stack Navigator: Native Stack (createNativeStackNavigator) e JS Stack (createStackNavigator). La differenza principale — dove viene eseguita l'animazione. Native Stack utilizza i driver di animazione nativi di iOS e Android, mentre JS Stack funziona attraverso il thread JavaScript di React Native. La scelta tra di essi dipende dai requisiti di prestazioni e personalizzazione.

Native Stack è consigliato per la maggior parte dei progetti. Fornisce animazioni fluide a 60 FPS senza bloccare il thread JS, supporta il gesto di scorrimento indietro di sistema su iOS e utilizza transizioni native — slide su iOS, fade su Android. Tuttavia, Native Stack è limitato nella personalizzazione delle animazioni: solo un insieme predefinito di transizioni è disponibile.

JS Stack dà il controllo completo sulle animazioni tramite cardStyleInterpolator. Lo sviluppatore può creare qualsiasi animazione: ridimensionamento, rotazione, parallasse, curve personalizzate. Lo svantaggio — le animazioni vengono eseguite nel thread JS, il che può causare cadute di fotogrammi su dispositivi deboli con transizioni complesse. Per il 70% dei progetti, Native Stack è più che sufficiente.

typescript
// Native Stack — implementazione consigliata
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>
  );
}

Installazione e configurazione di Stack Navigator

Per iniziare con Stack Navigator, è necessario installare React Navigation e le sue dipendenze. L'insieme minimo include @react-navigation/native, @react-navigation/native-stack e react-native-screens. Dopo l'installazione, l'applicazione viene racchiusa in NavigationContainer — un contesto che fornisce lo stato di navigazione a tutti i componenti figli.

bash
# Installazione delle dipendenze di React Navigation
npm install @react-navigation/native @react-navigation/native-stack
npm install react-native-screens react-native-safe-area-context

# Per iOS — installazione pod
cd ios && pod install && cd ..

Dopo l'installazione, viene creato Stack.Navigator con schermi specifici definiti in RootStackParamList. Ogni schermo è collegato a un componente React tramite la prop component. Il navigatore può essere radice o annidato all'interno di un altro navigatore (Tab, Drawer). Per la configurazione, si utilizzano screenOptions — comuni per tutti gli schermi o individuali per ciascuno.

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: 'Home' }} />
        <Stack.Screen name="Details" component={DetailsScreen}
          options={({ route }) => ({ title: route.params.title })} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

Parametri e personalizzazione di Stack Navigator

Stack Navigator fornisce molte opzioni per personalizzare l'aspetto e il comportamento. I parametri principali vengono impostati tramite screenOptions a livello di Navigator o options a livello di Screen. Lo sviluppatore può configurare l'intestazione, l'animazione di transizione, il gesto di scorrimento, lo stile della scheda e l'oscuramento dello sfondo. La flessibilità delle impostazioni consente di adattare la navigazione al sistema di design dell'applicazione.

OpzioneTipoDescrizione
headerShownbooleanMostra o nascondi l'intestazione dello schermo
headerStyleobjectStile della barra dell'intestazione (backgroundColor, elevation)
headerBackTitlestringTesto del pulsante «Indietro» (iOS)
gestureEnabledbooleanAbilita il gesto di scorrimento per tornare indietro
animationstringTipo di animazione: slide_from_right, fade, none
contentStyleobjectStile dell'area interna dello schermo

Animazioni personalizzate tramite cardStyleInterpolator

Per JS Stack, cardStyleInterpolator consente di creare animazioni di transizione arbitrarie tra gli schermi. È uno strumento potente per implementare effetti visivi unici: ridimensionamento, rotazione, parallasse, capovolgimento orizzontale. La funzione riceve i valori di avanzamento dell'animazione correnti (current, next) e restituisce stili per gli elementi animati.

Tipizzazione della navigazione con TypeScript

Stack Navigator supporta la tipizzazione completa tramite TypeScript. Per fare ciò, si definisce RootStackParamList — un tipo oggetto in cui le chiavi sono i nomi degli schermi e i valori sono i tipi dei parametri. Dopo la tipizzazione, navigation.navigate e route.params ottengono l'autocompletamento e il controllo dei tipi. Ciò elimina gli errori di passaggio dei parametri in fase di compilazione.

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

// Schermo tipizzato
type ProductScreenProps = NativeStackScreenProps<RootStackParamList, 'Product'>;

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

  return (
    <View>
      <Text>Prodotto {id} — {category}</Text>
      <Button title="Aggiungi al carrello"
        onPress={() => navigation.navigate('Checkout', {
          items: [{ id, quantity: 1 }],
          total: 99.99,
        })} />
    </View>
  );
}

Scenari avanzati: finestre modali e gruppi

Stack Navigator supporta il raggruppamento di schermi e finestre modali. I gruppi (Screen Group) consentono di applicare impostazioni comuni a più schermi senza duplicazione. Le finestre modali sono implementate tramite stack presentation: 'modal' — lo schermo si apre dal basso con oscuramento dello sfondo, come un modale di sistema su iOS. Questa opzione è disponibile solo in Native Stack.

Per la navigazione complessa, Stack Navigator può essere annidato all'interno di un Tab Navigator o Drawer Navigator. Ad esempio, la scheda «Home» ha la propria pila di schermi e la scheda «Profilo» ha la propria. Questa composizione di navigatori è l'approccio standard per le applicazioni di produzione. Ogni pila è isolata: la pila di ritorno all'interno di una scheda non influisce sulle altre schede.

typescript
// Pila annidata in 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>
  );
}

// Gruppi di schermi con opzioni condivise
<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>

Domande frequenti

Qual è la differenza tra navigate e push in Stack Navigator?

navigate cerca prima uno schermo esistente con quel nome nella pila e naviga verso di esso se trovato. push aggiunge sempre un nuovo schermo in cima alla pila, anche se ne esiste già uno. push è utile quando è necessario aprire lo stesso schermo con dati diversi (ad esempio, un profilo utente).

Come passare i parametri a uno schermo in Stack Navigator?

I parametri vengono passati come secondo argomento del metodo navigate: navigation.navigate('Profile', { userId: '123', name: 'John' }). Sullo schermo ricevente, i parametri sono disponibili tramite route.params. I tipi dei parametri vengono definiti in RootStackParamList per l'autocompletamento in TypeScript.

Stack Navigator o Tab Navigator — cosa scegliere?

Stack Navigator è adatto per la navigazione lineare (schermo → dettagli → modifica). Tab Navigator è per sezioni parallele dell'applicazione (Home, Ricerca, Profilo). Nei progetti di produzione, vengono combinati: il Tab Navigator contiene diversi Stack Navigator per ogni scheda.

Come funziona il pulsante «Indietro» in Stack Navigator?

Per impostazione predefinita, Stack Navigator aggiunge un pulsante «Indietro» nell'intestazione per tutti gli schermi tranne quello radice. Su iOS, funziona anche il gesto di scorrimento dal bordo sinistro. Il metodo navigation.goBack() rimuove lo schermo corrente dalla pila e riporta l'utente a quello precedente.

È possibile personalizzare completamente l'animazione in Stack Navigator?

Native Stack fornisce animazioni predefinite: slide_from_right, fade, none. Per la personalizzazione completa, si utilizza JS Stack con cardStyleInterpolator — una funzione che restituisce gli stili della scheda in ogni fotogramma dell'animazione. Ciò consente di creare qualsiasi transizione: ridimensionamento, parallasse, rotazione 3D.

Riepilogo

  • Stack Navigator — componente React Navigation per gestire gli schermi secondo il principio LIFO con prestazioni native
  • Native Stack (createNativeStackNavigator) utilizza animazioni native di iOS e Android ed è consigliato per l'85% dei progetti
  • RootStackParamList fornisce la tipizzazione completa dei parametri di navigazione in TypeScript
  • Screen options consentono di configurare intestazione, animazioni, gesti e stile di ogni schermo
  • Gruppi e modali — meccanismi integrati per organizzare schermi correlati e finestre modali
  • Composizione di navigatori — Stack Navigator è annidato in Tab/Drawer per l'architettura di produzione
  • JS Stack dà il controllo completo sulle animazioni tramite cardStyleInterpolator per transizioni uniche

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche