React Native'de Navigation ve Ekranlar Arası Geçiş
React Navigation ile Stack, Tab ve Drawer navigasyon türleri, ekranlar arası parametre geçişi, iç içe navigator yapıları, deep linking ve useNavigation/useFocusEffect hook'ları — detaylı örneklerle.
24 Nisan 2026 7 dk okuma 24 0
Merhaba arkadaşlar, bu makalemizde React Native uygulamalarının belki de en sık ihtiyaç duyulan özelliklerinden biri olan Navigation (ekranlar arası geçiş) konusuna girecek ve React Navigation kütüphanesini en yaygın kullanım senaryolarıyla inceliyor olacağız. Stack, Tab ve Drawer navigation türlerini, ekranlar arasında parametre aktarmayı, custom header yapmayı ve daha fazlasını göreceğiz.
Neden Ayrı Bir Kütüphaneye İhtiyacımız Var?
Web'de bir tıklama ile yeni sayfaya geçmek basit (tarayıcı bunu halletmez mi zaten?). Ama mobil uygulamalarda durum farklı. Kullanıcılar:
- Önceki ekrana geri dönmek ister (geri tuşu)
- Ekranlar arasında yumuşak animasyonlar bekler
- Alt tab bar, drawer menü gibi navigasyon şablonları görür
- iOS'ta "swipe to go back" gestleri kullanır
Bu deneyimleri elle kodlamak çok iş. İşte bu sebeple React Native dünyası React Navigation kütüphanesini kullanıyor — fiili standart artık.
npx expo install komutu, paketi Expo SDK versiyonunuza uyumlu şekilde kurar. Normal npm install kullanırsanız versiyon uyumsuzluğu olabilir.
Stack navigator için ek paket:
npm install @@react-navigation/native-stack
VS Code + Metro bundler - React Native projesinde App.tsx ve Stack.Navigator gorunumu.
IDE tarafinda: VS Code tarafinda projeyi actiginizda Explorer'da src/screens altindaki ekran bilesenlerini ve App.tsx icinde NavigationContainer + Stack.Navigator kurulumunu goruyorsunuz. Metro bundler entegre terminalde calisiyor.
Bottom tab navigator için:
npm install @@react-navigation/bottom-tabs
NavigationContainer: En Dıştaki Sarmalayıcı
Uygulamanın en dış katmanını NavigationContainer ile sarmalamamız gerekiyor. Bu, tüm navigation işlemlerinin koordine edildiği yer:
// App.tsx
import { NavigationContainer } from '@@react-navigation/native';
export default function App() {
return (
<NavigationContainer>
{/* Navigator buraya gelecek */}
</NavigationContainer>
);
}
Stack Navigator — Klasik Sayfa Yığını
En çok kullanılan navigasyon türü. Bir ekrana gittiğinizde o ekran yığının (stack) üzerine bindirilir, geri tuşuyla çıkarılır. iOS ve Android'in doğal davranışına benzer.
Dikkat ettiyseniz options'ı hem statik obje hem de fonksiyon olarak geçebiliyoruz. İkinci kullanım (fonksiyon) sayesinde header başlığını route params'a göre dinamik yapabiliyoruz.
Parametre Gönderme ve Alma
Bir ekrana giderken navigation.navigate('Ekran', { params }) ile parametre gönderiyoruz. Alan tarafta route.params üzerinden alıyoruz. TypeScript ile tip güvenliği sağlamak için RootStackParamList tanımını baştan yapmak çok önemli — bu sayede geçersiz parametre yollarsanız derleyici uyarır.
Navigasyon Metodları
- navigation.navigate('Ekran', params) — Belirtilen ekrana git
- navigation.push('Ekran', params) — Aynı ekran olsa bile yığına yeni bir kopya ekle
- navigation.goBack() — Bir önceki ekrana dön
- navigation.popToTop() — İlk ekrana dön, aradaki her şeyi sil
- navigation.replace('Ekran') — Mevcut ekranı değiştir (login sonrası home'a geçerken iyi)
- navigation.setOptions({ title: 'Yeni' }) — Dinamik başlık değiştirme
Bottom Tab Navigator — Alt Tab Bar
Instagram, Twitter gibi uygulamalarda alttaki tab bar'ı görürsünüz. İşte o. Kurulumdan sonra:
tabBarIcon her tab için ikon döndürür, focused aktif tab'i temsil eder ve biz outline/filled ikonları buna göre gösteriyoruz. Bu tarz küçük dokunuşlar kullanıcı deneyimi için çok değerli.
İç İçe Navigator'lar
Gerçek uygulamalarda navigator'ları iç içe kullanırız. Alt tab bar var, her tab'in kendi stack navigator'ı var, stack'in içinde detay ekranları var:
Bu yapıyı kurduktan sonra bildirimden gelen linkle, email'den gelen linkle, tarayıcıdan paylaşılan URL'le direkt ilgili ekrana açılabilirsiniz. Özellikle universal links (iOS) ve app links (Android) ile kombine edildiğinde çok güçlü bir özellik.
Programmatic Navigation — useNavigation Hook'u
Component'lerimize her seferinde navigation prop'unu geçirmek yerine, useNavigation hook'unu kullanabiliriz:
useFocusEffect — Ekran Her Odaklandığında
Bir ekran her odaklandığında (açıldığında veya geri dönüldüğünde) bir şey yapmak istiyorsak:
import { useFocusEffect } from '@@react-navigation/native';
import { useCallback } from 'react';
export function ProfilEkrani() {
useFocusEffect(
useCallback(() => {
console.log('Profile odaklanıldı, veriyi güncelleyelim');
// API çağrısı vb.
return () => {
console.log('Profile'den çıkıldı');
};
}, [])
);
return <Text>Profilim</Text>;
}
useEffect sadece mount'ta çalışırken, useFocusEffect ekran her görünür olduğunda çalışır. Bu fark çok önemli — örneğin kullanıcı profile sayfasına her geldiğinde son güncel bilgiyi çekmek için bunu kullanırız.
Dikkat Edilmesi Gereken Püf Noktaları
- Tip güvenliği: RootStackParamList'i baştan tanımlayın, TypeScript sizi korur.
- Büyük obje parametreleri: Params içine büyük objeler yerleştirmeyin. Bunun yerine ID gönderin ve alan ekran veriyi kendisi çeksin.
- NavigationContainer tek olmalı: Uygulamada yalnızca bir tane, en dışta.
- headerShown: false ile kendi custom header'ınızı yapabilirsiniz.
Özet
Bu makalede React Navigation'ın temel yapı taşlarını kapsamlı bir şekilde gördük: Stack, Tab, parametre aktarma, iç içe navigator'lar, deep linking ve programmatic navigation. Bu üç makalelik serinin sonuna geldik. Artık elinizde React Native ile gerçek bir uygulama yapmak için gereken temel araçların hepsi var: component, state, hook'lar ve navigasyon.
Sonraki adım olarak Redux Toolkit veya Zustand ile state yönetimi, AsyncStorage ile kalıcı veri saklama, Push Notification ve uygulama yayınlama konularına bakabilirsiniz. Bol kolay gelsin, mobil uygulama yolculuğunuzda başarılar dilerim. Sorularınızı yoruma yazın, cevaplamaya çalışırım...