Route, Navigator'ın gezinme geçmişinde ayrı bir ekranı veya sayfayı temsil eden Flutter'da soyut bir sınıftır. Route'un somut uygulamaları — MaterialPageRoute, CupertinoPageRoute ve PlatformRoute — ekranın nasıl görüntüleneceğini ve geçiş sırasında hangi animasyonun kullanılacağını belirler. Sıradan bir widget'ın aksine, Route'un didPush, didPop, didReplace ve didChangeNext yöntemleriyle kendi yaşam döngüsü vardır. Flutter API Reference (2026)'ya göre, her Route ModalBarrier'ı yönetir, platforma özgü özellikleri (iOS'ta geri kaydırma) dikkate alır ve ekranlar arasında durum yalıtımını sağlar.
Önemli Noktalar
Route, Flutter gezinme sisteminin temelidir. Kullanıcının bir uygulamada gördüğü her ekran, Navigator yığınında bulunan bir Route nesnesi ile temsil edilir. Route, ekranı kontrol kodundan soyutlar: Navigator Route'u ekler ve kaldırırken, Route'un içinde kullanıcının gördüğü arayüz bulunur. Bu mimari, gezinme ve görüntüleme arasındaki sorumluluğu ayırır.
Basit widget değiştirmenin aksine, Route sıradan widget'lar için kullanılamayan hizmetler sağlar: ModalBarrier (bir iletişim kutusu açıkken arka planı karartma), giriş ve çıkış animasyonu kontrolü, Android'de donanımsal geri düğmesi işleme ve ekranlar arasında yumuşak geçişler için Hero animasyonu ile entegrasyon.
Flutter Cookbook (2026)'ya göre Route, Hero animasyonu için anahtar bir öğedir: Bir Route'daki Hero widget'ı, sonraki Route'daki Hero widget'ına geçişi otomatik olarak canlandırarak “uçan” bir öğe efekti oluşturur. Bu, Route'un animasyon sırasında her iki ekranı da Overlay'de tutması sayesinde mümkündür.
Route, hem basit mobil uygulamalar (Navigator 1.0 aracılığıyla) hem de derin bağlantılı karmaşık senaryolar (Navigator 2.0) için temeldir. Navigator 2.0'da Route, RouterDelegate'ın rota yapılandırmasından dönüştürdüğü bir Page'i temsil eder. Bu nedenle, seçilen yaklaşım veya paketten bağımsız olarak herhangi bir Flutter gezinme sistemiyle çalışmak için Route'u anlamak esastır.
Flutter, her biri davranışı belirli bir platforma uyarlayan birkaç yerleşik Route uygulaması sağlar. Doğru Route türünü seçmek kullanıcı deneyimini etkiler: Android'de Material animasyonu ve iOS'ta Cupertino animasyonu “yerel” bir uygulama hissi yaratır.
| Route Türü | Animasyon | Platform | Özellikler |
|---|---|---|---|
| MaterialPageRoute | Aşağıdan yukarıya kaydırma | Android, masaüstü | Geçişte gölge, otomatik SafeArea işleme |
| CupertinoPageRoute | Sağdan sola kaydırma | iOS, iPadOS | Jest geri kaydırma, geçiş sırasında şeffaf arka plan |
| PlatformRoute | Otomatik seçim | Tüm platformlar | TargetPlatform'a göre türü seçer |
| PageRouteBuilder | Özel | Tüm platformlar | AnimationController aracılığıyla animasyon üzerinde tam kontrol |
MaterialPageRoute en sık kullanılan Route uygulamasıdır. Yeni ekranı aşağıdan yukarıya doğru kademeli görünümle canlandırır. Çıkışta ekran yukarıdan aşağıya doğru canlanarak orijinal konumuna döner. Araç çubuğu (AppBar) ve ekran gövdesi ayrı ayrı canlanarak bir hiyerarşi efekti oluşturur.
CupertinoPageRoute, iOS'taki UINavigationController'ı taklit eder. Yeni ekran sağdan girerek önceki ekranı kaplar. Temel özellik, CupertinoBackGestureDetector aracılığıyla uygulanan etkileşimli geri kaydırma jesti desteğidir. Bu jest animasyonun ortasında bile işlenerek iPhone kullanıcılarının aşina olduğu doğal bir davranış sağlar.
Route, normal bir StatefulWidget'ın yaşam döngüsünden farklı olan kendi yaşam döngüsüne sahiptir. Bu döngüyü anlamak, doğru veri başlatma, akış abonelikleri ve bir ekran kapatılırken kaynakların serbest bırakılması için gereklidir.
Route yaşam döngüsü dört ana aşamadan oluşur. Geçiş — Route oluşturulur ve girişte canlandırılır (didPush çağrılır). Aktif — Route tamamen görüntülenir ve kullanıcıyla etkileşime girer. Pasif — başka bir Route mevcut olanı kaplar (iletişim kutusu, alt sayfa), ancak Route yığında kalır. Atılmış — Route yığından kaldırılır ve yok edilir, didPop ve dispose çağrılır.
Route yaşam döngüsü yöntemleri özel bir uygulamada geçersiz kılınabilir. Örneğin, didPop Route yığından kaldırıldığında çağrılır — burada taslak verileri kaydedebilirsiniz. didChangeNext, yığındaki sonraki Route değiştiğinde çağrılır — gezinme geçmişi değiştiğinde UI'ı güncellemek için kullanışlıdır.
Flutter API Route.didPop (2026)'ya göre, Route'un yaşam döngüsünü Route içindeki State'in yaşam döngüsüyle karıştırmamak önemlidir. Route içindeki StatefulWidget'ın, sırasıyla Geçiş ve Atılmış aşamalarında çağrılan kendi initState ve dispose'u vardır. Route, iç State'inden daha uzun yaşar — Route, widget'ları geçici olarak başka bir Route tarafından gizlense bile Overlay'de kalır.
Route hem girişte (oluşturulurken) hem de çıkışta (tamamlandığında) veri aktarmak için mekanizmalar sağlar. Route aracılığıyla doğru veri aktarımı, genel değişkenlere ve InheritedWidget'a olan ihtiyacı ortadan kaldırarak gezinmeyi tür güvenli ve öngörülebilir hale getirir.
Yeni bir ekrana veri aktarmak için alıcı widget'ın yapıcısını veya Navigator.pushNamed'deki arguments parametresini kullanın. Route içinde verilere, Route nesnesinde saklanan RouteSettings.arguments aracılığıyla erişilebilir. Bu yaklaşım tüm Route türleri için çalışır — MaterialPageRoute, CupertinoPageRoute ve özel uygulamalar.
Veri döndürmek için Navigator.pop(context, result) öğesinin ikinci argümanını kullanın. Navigator.push, pop'a iletilen değerle tamamlanan Future
MaterialPageRoute ile doğrudan Navigator.push çağrılırken, veriler hedef ekranın yapıcısı aracılığıyla iletilir. MethodChannel kullanılmaz — bu saf bir Dart etkileşimidir. Bu yaklaşım, karmaşık nesnelerin tür güvenli aktarımı için tercih edilir.
Kendi animasyonu ve veri aktarımı olan özel bir Route oluşturma örneğine bakalım. PageRouteBuilder, animasyon eğrisi ve süresi üzerinde tam kontrol ile giriş ve çıkış animasyonlarını tanımlamaya olanak tanır.
// Kaydırma animasyonlu özel Route
Navigator.push(context, PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) {
return DetailPage(productId: '42');
},
transitionsBuilder: (context, animation, secondaryAnimation, child) {
const begin = Offset(0.0, 0.3);
const end = Offset.zero;
final tween = Tween(begin: begin, end: end);
final offsetAnimation = animation.drive(tween);
return SlideTransition(position: offsetAnimation, child: child);
},
transitionDuration: const Duration(milliseconds: 400),
));
// Ekrandan veri döndür
ElevatedButton(
onPressed: () => Navigator.of(context).pop({'selected': true, 'id': '42'}),
child: const Text('Seç'),
);
// Çağıran ekranda sonucu al
final result = await Navigator.push(context, MaterialPageRoute(
builder: (context) => const SelectionPage(),
));
if (result != null) {
print('Seçildi: ${result['selected']}');
}
Örnekte, PageRouteBuilder şeffaflıkla aşağıdan özel bir kaydırma animasyonu tanımlar. transitionDuration animasyon hızını ayarlar. Kod ayrıca sonuç aktarımını da gösterir: detay ekranı, kullanıcının seçimiyle bir Map döndürür ve çağıran ekran, push'tan Future aracılığıyla bu verileri alır. Route tam yalıtım sağlar: detay ekranındaki taslaklar liste durumunu etkilemez.
Sıkça Sorulan Sorular
Route, bir ekranı gezinme düzeyinde yöneten bir nesnedir: animasyonu, ModalBarrier'ı ve yaşam döngüsünü saklar. Widget, arayüzün bir bölümünün açıklamasıdır. Route, içinde Widget'ı barındırır, ancak sıradan widget'lar için kullanılamayan hizmetler (Overlay katmanı, Hero animasyonu) da sağlar. Bir Route, herhangi bir derinlikte karmaşık bir widget hiyerarşisi içerebilir.
pageBuilder (ekran oluşturma) ve transitionsBuilder (animasyon tanımı) parametreleriyle PageRouteBuilder kullanın. transitionsBuilder'da paralel animasyonlar için animation (0.0–1.0) ve secondaryAnimation mevcuttur. Tam kontrol için Route'un bir alt sınıfını oluşturun ve buildPage, createAnimationController ile buildTransitions'ı geçersiz kılarak düşük seviyeli AnimationController'a erişim sağlayın.
Karmaşık nesneleri aktarmak için doğrudan Navigator.push çağrılırken hedef ekranın yapıcısını veya pushNamed ile arguments parametresini kullanın. Nesnenin serileştirilebilir olduğundan emin olun (Map, JSON veya özel sınıf). Flutter'da tür güvenli aktarım için, RouteSettings aracılığıyla aktarılırken doğru serileştirme çözümünü garanti eden freezed veya json_serializable modellerini kullanın.
Route Navigator yığınında kalırsa Route.dispose çağrılmaz. Örneğin, yeni bir Route açılırken eski Route pasif duruma geçer ancak yok edilmez — hızlı dönüş için yığında kalır. Dispose yalnızca Route pop, pushReplacement veya pushAndRemoveUntil ile yığından kaldırıldığında çağrılır. Kaynakları serbest bırakmak için Route'un kendi dispose'u yerine Route içindeki State'in dispose'unu kullanın.
BuildContext'ten mevcut Route'u almak için ModalRoute.of(context) kullanın. ModalRoute.isActive özelliği, Route'un şu anda görünen ekran olup olmadığını gösterir. ModalRoute.isCurrent — Route yığının tepesindeyse true. Yığın değişikliklerini gözlemlemek için RouteAware ve RouteObserver aracılığıyla Navigator gözlemcilerine abone olun; bunlar etkin Route değişikliklerini bildirir.
Ö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