Flutter & Mobil İle Derin Bağlantılı Navigasyon Yapısı Nasıl Yapılır?

Flutter & Mobil İle Derin Bağlantılı Navigasyon Yapısı Nasıl Yapılır?
Flutter & Mobil İle Derin Bağlantılı Navigasyon Yapısı Nasıl Yapılır?

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.json dosyası ve iOS için apple-app-site-association dosyası.
  • 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:

  1. Terminal Loglarını İzleyin: flutter run -v komutu ile uygulamayı çalıştırın ve derin bağlantıya tıkladığınızda konsola düşen hata mesajlarını (özellikle intent veya universal link hatalarını) inceleyin.
  2. Manifest/Entitlements Kontrolü: Android tarafında AndroidManifest.xml dosyasındaki intent-filter bloğunun android:autoVerify="true" değerine sahip olduğundan emin olun.
  3. Asset Link Dosyası: Web sunucunuzda bulunan assetlinks.json (Android) veya apple-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.

Bu yazıya tepkinizi paylaşın:
Kerem Aydın

Mutfağından bahçesine, yaşamın her alanında hızlı ve etkili çözüm rehberleri hazırlıyorum. Bilgi kirliliğinden uzak, doğrudan sonuca odaklanan içerikler üretiyorum.

Yorumlar (20)

20
okuyucu bu yazı hakkında yorum yaptı. Siz de deneyiminizi paylaşarak diğer okuyuculara yardımcı olabilirsiniz.
Deniz Yıldırım
Deniz Yıldırım 13 Temmuz 2026

Kodları kopyalayıp denedim, gayet başarılı çalışıyor. Emeğinize sağlık hocam.

Ceren M.
Ceren M. 14 Temmuz 2026

Bende de çalıştı, harika bir kaynak gerçekten.

Oğuzhan Kaya
Oğuzhan Kaya 18 Temmuz 2026

Harika özet. Peki bu yapı içerisinde auth guard kullanırken route'ları koruma altına almak için en mantıklı yöntem nedir?

Kerem Aydın
Kerem Aydın 19 Temmuz 2026

GoRouter'ın `redirect` özelliğini kullanarak bir auth state'ine göre yönlendirme yapmak en temiz yöntem bence.

Hakan Demir
Hakan Demir 23 Temmuz 2026

Flutter'da router yapısı bi türlü oturmuyo kafamda, bu yazı ilaç gibi geldi valla.

Selma Ak
Selma Ak 24 Temmuz 2026

Valla ben de öyle, Navigator 2.0 çok karmaşık geliyordu, GoRouter hayat kurtarıyo.

Ayşegül
Ayşegül 26 Temmuz 2026

Yazı güzel ama biraz daha görsel destekle daha iyi olabilirdi, kod blokları bazen birbirine giriyo gibi hissettirdi.

Kerem Aydın
Kerem Aydın 27 Temmuz 2026

Haklısın Ayşegül, bir sonraki teknik yazıda şema görselleri eklemeye dikkat edeceğim, eleştirin için teşekkürler.

Gökhan Şahin
Gökhan Şahin 28 Temmuz 2026

Emeğine sağlık çok güzel yazı olmuş. Bi sorum olacaktı, uygulama kapalıyken gelen bildirimde derin link nasıl tetikleniyor?

Kerem Aydın
Kerem Aydın 29 Temmuz 2026

Gökhan, bunun için Firebase Dynamic Links veya direkt FCM üzerinden gelen veriyi go_router'a yönlendirmen gerekiyor. İstersen üzerine ayrı bir yazı yazabilirim.

Mertcan Vural
Mertcan Vural 30 Temmuz 2026

Abi anlatımın çok net olmuş ama şema (scheme) tanımlamalarını biraz daha detaylandırabilir miydin? ios tarafı beni çok uğraştırdı.

Deniz Kara
Deniz Kara 31 Temmuz 2026

Aynen, Xcode'da URL Types eklemeyi unutunca çalışmıyor zaten, bende ilk başta çok uğraşmıştım.

Zeynep Arslan
Zeynep Arslan 01 Ağustos 2026

Deeper linkler için branch.io gibi servisleri mi önerirsin yoksa bu yöntem her proje için yeterli mi?

Kerem Aydın
Kerem Aydın 02 Ağustos 2026

Basit projeler için bu yöntem yeterli ama derin analiz ve attribution gerekiyorsa Branch.io daha profesyonel bir tercih olur.

Burak Özdemir
Burak Özdemir 02 Ağustos 2026

Flutter 3.x sürümüyle beraber go_router kullanımı baya değişti, güncel bir kaynak arıyordum. Eline sağlık.

Kerem Aydın
Kerem Aydın 03 Ağustos 2026

Kesinlikle, eski dökümanlar kafa karıştırabiliyor. Güncel tutmaya çalıştım, teşekkürler.

Selin_Dev
Selin_Dev 03 Ağustos 2026

Ya ben bu android manifest ayarlarını bi türlü yapamıyom, sürekli hata veriyo. Yardımcı olabilir misin?

Emre Güneş
Emre Güneş 04 Ağustos 2026

Selin, manifest içindeki intent-filter taglerini kontrol et, genelde oradaki scheme hatasından kaynaklanıyor.

Caner Yılmaz
Caner Yılmaz 05 Ağustos 2026

Harika bir rehber olmuş Kerem hocam, GoRouter ile bu yapılandırma gerçekten çok karmaşık geliyordu, sayende çözdüm.

Kerem Aydın
Kerem Aydın 06 Ağustos 2026

Çok teşekkürler Caner, karmaşıklığı azaltabildiysek ne mutlu!

Yorum Yaz