Stack Navigator — mobil uygulama ekranlarını yığın prensibine (LIFO) göre yönetmek için React Navigation kütüphanesinin bir bileşenidir. Her yeni ekran bir öncekinin üzerine yerleştirilir ve «Geri» düğmesi üst ekranı kaldırarak kullanıcıyı bir önceki ekrana döndürür. Navigasyon mimarisi hakkında daha fazla bilgi için resmi React Navigation dokümantasyonuna bakın.
Önemli Noktalar
Stack Navigator — ekranların yığın modelini uygulayan React Navigation kütüphanesinin temel navigatörlerinden biridir. Mobil kullanıcıların aşina olduğu navigasyonu sağlar: yeni bir ekran açmaya sağa kaydırma animasyonu eşlik eder ve «Geri» düğmesi veya kaydırma hareketi kullanıcıyı bir önceki ekrana döndürür. Stack Navigator, maksimum performans için platformun yerel bileşenlerini kullanarak iOS ve Android'i destekler.
React Navigation, React Native için en popüler navigasyon kütüphanesidir ve projelerin %85'inde kuruludur (npm verilerine göre, 2026). Stack Navigator çekirdeğinin bir parçasıdır ve iki uygulamada mevcuttur: createNativeStackNavigator (yerel, önerilen) ve createStackNavigator (JavaScript, karmaşık özel animasyonlar için). Yerel sürüm React Navigation v5'te ortaya çıktı ve v6+'da standart haline geldi.
Stack Navigator'ın ana avantajı — iOS ve Android kullanıcılarının aşina olduğu doğal davranıştır. iOS'ta yığın görsel olarak UINavigationController tarafından, Android'de ise kaydırma animasyonlu FragmentManager tarafından temsil edilir. Geliştiricinin yığın mantığını manuel olarak uygulaması gerekmez — navigatör ekran durumlarını, geri yığınını ve animasyonları otomatik olarak yönetir.
Yığın navigasyonu LIFO (Last In, First Out) prensibine dayanır. Kullanıcı yeni bir ekran açtığında, navigatör onu yığının en üstüne yerleştirir. «Geri»ye basıldığında, üst ekran kaldırılır ve kullanıcı bir önceki ekranı görür. Yığın herhangi bir sayıda ekran içerebilir — tek sınır cihaz belleğidir.
Yığındaki her ekran durumunu korur. Bir önceki ekrana dönüldüğünde, durumu otomatik olarak geri yüklenir. Bu, yığını diğer navigasyon türlerinden (Tab, Drawer) ayırır; bu türlerde ekranlar yeniden oluşturulabilir. React Navigation, kendi navigasyon bağlam mekanizması aracılığıyla durumu yönetir.
| Eylem | Sonuç | Örnek |
|---|---|---|
| navigate | Ekranı yığının en üstüne yerleştirir | navigation.navigate('Profile') |
| goBack | Üst ekranı yığından kaldırır | navigation.goBack() |
| push | Zorla yeni bir ekran ekler | navigation.push('Profile') |
| popToTop | Kök ekrana döner | navigation.popToTop() |
| reset | Tüm yığını yeni bir kümeyle değiştirir | navigation.reset({ index: 0, routes: [...] }) |
iOS'ta Stack Navigator, geri dönmek için sol kenardan kaydırma hareketini destekler — bu, kullanıcıların beklediği standart iOS davranışıdır. Android'de hareket varsayılan olarak devre dışıdır ancak gestureEnabled seçeneğiyle etkinleştirilebilir. Native Stack'te hareket, JavaScript iş parçacığı gecikmesi olmadan yerel olarak çalışır.
React Navigation iki tür Stack Navigator sunar: Native Stack (createNativeStackNavigator) ve JS Stack (createStackNavigator). Temel fark — animasyonun nerede yürütüldüğüdür. Native Stack, iOS ve Android'in yerel animasyon sürücülerini kullanırken, JS Stack, React Native'in JavaScript iş parçacığı aracılığıyla çalışır. Aralarındaki seçim, performans ve özelleştirme gereksinimlerine bağlıdır.
Native Stack çoğu proje için önerilir. JS iş parçacığını engellemeden akıcı 60 FPS animasyonlar sağlar, iOS'ta sistem kaydırma-geri hareketini destekler ve yerel geçişler kullanır — iOS'ta slide, Android'de fade. Ancak Native Stack, animasyon özelleştirmede sınırlıdır: yalnızca önceden tanımlanmış bir geçiş kümesi mevcuttur.
JS Stack, cardStyleInterpolator aracılığıyla animasyonlar üzerinde tam kontrol sağlar. Geliştirici herhangi bir animasyon oluşturabilir: ölçekleme, döndürme, paralaks, özel eğriler. Dezavantajı — animasyonlar JS iş parçacığında çalışır ve karmaşık geçişlerde zayıf cihazlarda kare düşüşlerine neden olabilir. Projelerin %70'i için Native Stack fazlasıyla yeterlidir.
// Native Stack — önerilen uygulama
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>
);
}Stack Navigator ile başlamak için React Navigation ve bağımlılıklarını kurmak gerekir. Minimum küme @react-navigation/native, @react-navigation/native-stack ve react-native-screens'i içerir. Kurulumdan sonra uygulama NavigationContainer'a sarılır — bu, tüm alt bileşenlere navigasyon durumu sağlayan bir bağlamdır.
# React Navigation bağımlılıklarını kurma
npm install @react-navigation/native @react-navigation/native-stack
npm install react-native-screens react-native-safe-area-context
# iOS için — pod kurulumu
cd ios && pod install && cd ..Kurulumdan sonra, Stack.Navigator RootStackParamList'te tanımlanan belirli ekranlarla oluşturulur. Her ekran, component prop aracılığıyla bir React bileşenine bağlanır. Navigatör, kök veya başka bir navigatörün (Tab, Drawer) içine yerleştirilmiş olabilir. Yapılandırma için screenOptions kullanılır — tüm ekranlar için ortak veya her biri için ayrı.
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: 'Ana Sayfa' }} />
<Stack.Screen name="Details" component={DetailsScreen}
options={({ route }) => ({ title: route.params.title })} />
</Stack.Navigator>
</NavigationContainer>
);
}Stack Navigator, görünüm ve davranışı özelleştirmek için birçok seçenek sunar. Ana parametreler, Navigator düzeyinde screenOptions veya Screen düzeyinde options aracılığıyla ayarlanır. Geliştirici başlığı, geçiş animasyonunu, kaydırma hareketini, kart stilini ve arka plan karartmasını yapılandırabilir. Ayarların esnekliği, navigasyonun uygulamanın tasarım sistemine uyarlanmasına olanak tanır.
| Seçenek | Tür | Açıklama |
|---|---|---|
| headerShown | boolean | Ekran başlığını göster veya gizle |
| headerStyle | object | Başlık çubuğu stili (backgroundColor, elevation) |
| headerBackTitle | string | «Geri» düğmesi metni (iOS) |
| gestureEnabled | boolean | Geri kaydırma hareketini etkinleştir |
| animation | string | Animasyon türü: slide_from_right, fade, none |
| contentStyle | object | Ekranın iç alan stili |
JS Stack için cardStyleInterpolator, ekranlar arasında isteğe bağlı geçiş animasyonları oluşturmayı sağlar. Bu, benzersiz görsel efektler uygulamak için güçlü bir araçtır: ölçekleme, döndürme, paralaks, yatay çevirme. İşlev, geçerli animasyon ilerleme değerlerini (current, next) alır ve animasyonu yapılan öğeler için stiller döndürür.
Stack Navigator, TypeScript aracılığıyla tam tip belirlemeyi destekler. Bunun için RootStackParamList tanımlanır — anahtarları ekran adları ve değerleri parametre türleri olan bir nesne türü. Tip belirlemeden sonra navigation.navigate ve route.params otomatik tamamlama ve tür denetimi alır. Bu, derleme zamanında parametre aktarma hatalarını ortadan kaldırır.
type RootStackParamList = {
Home: undefined;
Product: { id: string; category: string };
Checkout: { items: CartItem[]; total: number };
};
// Tiplenmiş ekran
type ProductScreenProps = NativeStackScreenProps<RootStackParamList, 'Product'>;
function ProductScreen({ navigation, route }: ProductScreenProps) {
const { id, category } = route.params;
return (
<View>
<Text>Ürün {id} — {category}</Text>
<Button title="Sepete ekle"
onPress={() => navigation.navigate('Checkout', {
items: [{ id, quantity: 1 }],
total: 99.99,
})} />
</View>
);
}Stack Navigator, ekran gruplamayı ve modal pencereleri destekler. Gruplar (Screen Group), tekrarlama olmadan birden çok ekrana ortak ayarlar uygulamayı sağlar. Modal pencereler, stack presentation: 'modal' aracılığıyla uygulanır — ekran, iOS'taki sistem modalı gibi arka plan karartmasıyla alttan açılır. Bu seçenek yalnızca Native Stack'te kullanılabilir.
Karmaşık navigasyon için Stack Navigator, bir Tab Navigator veya Drawer Navigator içine yerleştirilebilir. Örneğin, «Ana Sayfa» sekmesinin kendi ekran yığını ve «Profil» sekmesinin kendi yığını vardır. Navigatörlerin bu şekilde birleştirilmesi, üretim uygulamaları için standart yaklaşımdır. Her yığın yalıtılmıştır: bir sekme içindeki geri yığını diğer sekmeleri etkilemez.
// Tab Navigator'da iç içe yığın
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>
);
}
// Paylaşılan seçeneklerle ekran grupları
<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>Sıkça Sorulan Sorular
navigate önce yığında bu ada sahip mevcut bir ekranı arar ve bulursa ona gider. push her zaman yığının en üstüne yeni bir ekran ekler, zaten var olsa bile. push, aynı ekranı farklı verilerle açmanız gerektiğinde kullanışlıdır (örneğin, bir kullanıcı profili).
Parametreler navigate yönteminin ikinci argümanı olarak iletilir: navigation.navigate('Profile', { userId: '123', name: 'John' }). Alıcı ekranda parametrelere route.params aracılığıyla erişilebilir. TypeScript'te otomatik tamamlama için parametre türleri RootStackParamList'te tanımlanır.
Stack Navigator doğrusal navigasyon (ekran → detaylar → düzenleme) için uygundur. Tab Navigator uygulamanın paralel bölümleri (Ana Sayfa, Arama, Profil) içindir. Üretim projelerinde bunlar birleştirilir: Tab Navigator, her sekme için birden çok Stack Navigator içerir.
Varsayılan olarak Stack Navigator, kök ekran hariç tüm ekranların başlığına bir «Geri» düğmesi ekler. iOS'ta sol kenardan kaydırma hareketi de çalışır. navigation.goBack() yöntemi, geçerli ekranı yığından kaldırır ve kullanıcıyı bir önceki ekrana döndürür.
Native Stack önceden tanımlanmış animasyonlar sağlar: slide_from_right, fade, none. Tam özelleştirme için JS Stack, cardStyleInterpolator ile kullanılır — her animasyon karesinde kart stilleri döndüren bir işlev. Bu, ölçekleme, paralaks, 3B döndürme gibi herhangi bir geçiş oluşturmayı sağlar.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun