Gereksinimler ve Ön Hazırlık
Derin bağlantı yapısını kurmaya başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. 2026 yılı itibarıyla Flutter 3.x ve üzeri sürümler, "go_router" paketi ile en optimize navigasyon deneyimini sunmaktadır. Ayrıca, Android için "App Links" ve iOS için "Universal Links" yapılandırmalarının temellerine hakim olmanız gerekir.
- Flutter SDK 3.24 veya üzeri bir sürüm.
- GoRouter paketi (navigasyon yönetimini merkezileştirmek için).
- Android için
assetlinks.jsondosyası ve iOS içinapple-app-site-associationdosyası. - Doğrulanmış bir alan adı (Domain) - (Örn: https://uygulamaniz.com).
GoRouter ile Navigasyon Yapısını Kurma
Geleneksel Navigator 2.0 yerine GoRouter kullanmak, derin bağlantıların yönetilmesini deklaratif bir yapıya kavuşturur. İlk adım olarak, uygulama rotalarımızı tanımlayan bir yapı oluşturalım.
import 'package:go_router/go_router.dart';
final GoRouter appRouter = GoRouter(
initialLocation: '/',
routes: [
GoRoute(
path: '/',
builder: (context, state) => HomeScreen(),
),
GoRoute(
path: '/urun/:id',
builder: (context, state) {
final id = state.pathParameters['id'];
return ProductDetailScreen(productId: id!);
},
),
],
);
Yukarıdaki kod bloğunda, /urun/:id şeklinde dinamik bir rota tanımladık. state.pathParameters kullanarak URL içerisindeki değişkeni yakalıyoruz. Bu, derin bağlantı geldiğinde uygulamanın hangi ürünü göstereceğini anlamasını sağlar.
Android ve iOS İçin Konfigürasyon Adımları
Uygulamanızın gelen URL'leri "dinlemesi" için işletim sistemi seviyesinde izin vermeniz gerekir. Android tarafında AndroidManifest.xml dosyanızda intent-filter tanımlamalısınız.
Bu yapılandırma, cihazın "uygulamaniz.com" adresine gelen tüm istekleri uygulamanıza yönlendirmesini sağlar. autoVerify="true" parametresi, Google'ın web sitenizdeki assetlinks.json dosyasını doğrulamasını tetikler.
Derin Bağlantı (Deep Link) Testi Nasıl Yapılır?
Kodunuzu yazdıktan sonra test etmek, hata ayıklama sürecinin en önemli parçasıdır. Emülatör veya gerçek cihaz üzerinde terminal komutlarını kullanarak bağlantıların çalışıp çalışmadığını kontrol edebilirsiniz.
adb shell am start -W -a android.intent.action.VIEW -d "https://uygulamaniz.com/urun/123" com.paket.adiniz
Bu komut, emülatörünüze sanki bir tarayıcıdan linke tıklanmış gibi bir komut gönderir. Eğer yapılandırmanız doğruysa, uygulamanız açılmalı ve doğrudan 123 ID'li ürün sayfasına gitmelidir.
Navigasyon Yöntemleri Karşılaştırması
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Navigator 1.0 | Basit, hızlı kurulum | Derin bağlantı yönetimi çok zor |
| GoRouter | URL tabanlı, ölçeklenebilir | Öğrenme eğrisi biraz daha yüksek |
Güvenlik ve Veri Doğrulama
Kritik Uyarı: Derin bağlantı üzerinden gelen veriler (ID'ler, tokenlar vb.) kullanıcı tarafından manipüle edilebilir. Uygulamanızda bu verileri kullanırken mutlaka tür dönüşümü kontrolleri yapın ve SQL injection veya yetkisiz erişime karşı sunucu tarafında doğrulamayı asla ihmal etmeyin.
Gelen parametrelerin güvenli olduğundan emin olmak için int.tryParse gibi yöntemler kullanın. Asla doğrudan gelen string veriyi veritabanı sorgusunda kullanmayın.
builder: (context, state) {
final id = state.pathParameters['id'];
final int? productId = int.tryParse(id ?? '');
if (productId == null) {
return ErrorScreen(message: "Geçersiz ürün kimliği");
}
return ProductDetailScreen(productId: productId);
},
Bu kod bloğu, kullanıcı URL'ye rastgele metinler girse bile uygulamanın çökmesini engeller ve kullanıcıyı güvenli bir hata ekranına yönlendirir.
Sıkça Sorulan Sorular
Derin bağlantı neden çalışmıyor?
Genellikle assetlinks.json dosyasının web sunucusunda doğru dizinde (.well-known/) bulunmamasından veya SHA-256 parmak izinin yanlış olmasından kaynaklanır.
Universal Links ile Deep Links farkı nedir?
Universal Links (iOS) daha güvenli bir yöntemdir ve web sitesi ile uygulama arasında doğrudan bir bağ kurar. Deep Links ise daha genel bir yapıdır ve bazen tarayıcı ile uygulama arasında çatışma yaşatabilir.
GoRouter'da alt rotalar (Sub-routes) nasıl kullanılır?
routes dizisi içerisinde routes: [] parametresini kullanarak iç içe geçmiş navigasyon yapısı kurabilirsiniz.
Kullanıcı uygulamayı henüz yüklemediyse ne olur?
Bu durum için "Deferred Deep Linking" (Ertelenmiş Derin Bağlantı) servislerini (Firebase Dynamic Links gibi alternatifler) kullanmanız gerekir; ancak günümüzde çoğu geliştirici doğrudan App Store/Play Store yönlendirmesi kullanmaktadır.
Navigasyon geçmişini nasıl yönetirim?
GoRouter, context.go() ve context.push() yöntemleriyle geçmiş yönetimini otomatik olarak yapar; go metodu mevcut rotayı değiştirirken push metodu yığına (stack) yeni bir sayfa ekler.
Derin Bağlantı Senaryosu: E-Ticaret Uygulamasında Dinamik Ürün Yönlendirme
Gerçek dünya projelerinde derin bağlantılar genellikle pazarlama kampanyalarıyla iç içe çalışır. Bir e-ticaret uygulamasında, bir kullanıcıya gönderilen "İndirimli Ürün" bildirimine tıklandığında, doğrudan o ürünün detay sayfasına gitmek dönüşüm oranlarını artırır. Aşağıdaki örnek, gelen URL parametrelerini nasıl ayrıştırıp ilgili sayfaya aktaracağınızı gösterir.
// GoRoute tanımlamasında parametre kullanımı
GoRoute(
path: '/product/:id',
builder: (context, state) {
final productId = state.pathParameters['id'];
return ProductDetailsScreen(id: productId!);
},
),
Bu yapıda :id kısmı dinamiktir. Uygulama, myapp://shop/product/123 adresini aldığında productId değişkenine "123" değerini atar ve ProductDetailsScreen widget'ını bu ID ile başlatır. Bu yöntem, uygulamanızın her bir ürün için ayrı bir rota tanımlamanıza gerek kalmadan dinamik içerik sunmasını sağlar.
Derin Bağlantılarda Performans Optimizasyonu
Derin bağlantılar, uygulamanın soğuk başlangıç (cold start) anında tetiklenebilir. Bu durumda uygulamanın ana ekranı yüklenmeden önce yönlendirme yapılması gerekir. Performansı korumak için şu stratejileri izlemelisiniz:
- Lazy Loading: Yönlendirilen sayfadaki ağır görselleri veya veri isteklerini, navigasyon animasyonu tamamlandıktan sonra tetikleyin.
- Route Guard Kullanımı: Kullanıcı giriş yapmamışsa, derin bağlantı ile özel bir sayfaya gitmeye çalıştığında, önce giriş ekranına yönlendirin ve giriş sonrası orijinal hedefe dönmesini sağlayın.
- State Management: Navigasyon parametrelerini global bir state yönetim aracı (Provider, Riverpod veya Bloc) üzerinden değil, doğrudan route state üzerinden yöneterek bellek kullanımını optimize edin.
// Giriş kontrolü yapan basit bir guard örneği
redirect: (context, state) {
final isLoggedIn = authService.isAuthenticated;
if (!isLoggedIn && state.uri.path.startsWith('/profile')) {
return '/login';
}
return null;
},
Derin Bağlantı Hata Ayıklama (Debugging) İpuçları
Derin bağlantıların çalışmadığı durumlarda, sorunun kaynağını bulmak için şu adımları izleyin:
- Terminal Loglarını İzleyin:
flutter run -vkomutu ile uygulamayı çalıştırın ve derin bağlantıya tıkladığınızda konsola düşen hata mesajlarını (özellikleintentveyauniversal linkhatalarını) inceleyin. - Manifest/Entitlements Kontrolü: Android tarafında
AndroidManifest.xmldosyasındakiintent-filterbloğununandroid:autoVerify="true"değerine sahip olduğundan emin olun. - Asset Link Dosyası: Web sunucunuzda bulunan
assetlinks.json(Android) veyaapple-app-site-association(iOS) dosyalarının geçerli bir JSON formatına sahip olduğunu ve doğru domain altında yayınlandığını doğrulayın.
İpucu: Derin bağlantılarınızı test ederken fiziksel cihaz kullanmak, emülatörlerin bazen işletim sistemi seviyesindeki link yönlendirmelerini tam simüle edememesi nedeniyle daha güvenilir sonuçlar verir.
Sonuç
Flutter ile derin bağlantılı navigasyon yapısı kurmak, uygulamanızın profesyonel ve kullanıcı dostu görünmesi için şarttır. GoRouter kullanarak oluşturduğunuz bu yapı, uygulamanızın ölçeklenebilirliğini artırır ve dış dünyadan gelen trafiği verimli bir şekilde karşılamanızı sağlar. Bir sonraki adım olarak, Firebase Analytics veya benzeri araçlarla bu derin bağlantılardan gelen kullanıcıların davranışlarını takip etmeyi öğrenebilirsiniz.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamına almadan önce tüm güvenlik kontrollerini, özellikle veri doğrulama ve yetkilendirme süreçlerini kendi projenizin ihtiyaçlarına göre özelleştirin.


Yorumlar (0)
Yorum Yaz