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 (0)

Yorum Yaz