Flutter & Mobil İle Konum Tabanlı Restoran Bulma Servisi Nasıl Yapılır?

Flutter & Mobil İle Konum Tabanlı Restoran Bulma Servisi Nasıl Yapılır?
Flutter & Mobil İle Konum Tabanlı Restoran Bulma Servisi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. 2026 itibarıyla Flutter 3.x ve üzeri sürümler, performans ve güvenlik açısından zorunludur. Aşağıdaki araçların yüklü olması gerekmektedir:

  • Flutter SDK (En güncel kararlı sürüm)
  • Android Studio veya VS Code (Gerekli eklentilerle birlikte)
  • Google Cloud Platform hesabı (API anahtarları için)
  • Geolocator ve Google Maps Flutter paketleri

Projenizin pubspec.yaml dosyasına gerekli bağımlılıkları ekleyerek işe başlayın. Bu paketler, cihazın konumunu almak ve harita üzerinde görselleştirmek için temel yapı taşlarıdır.

dependencies:
  flutter:
    sdk: flutter
  geolocator: ^13.0.1
  google_maps_flutter: ^3.0.0
  http: ^1.2.0
  permission_handler: ^11.0.0

Adım Adım Konum İzinleri ve GPS Erişimi

Mobil uygulamalarda konum verisine erişmek, kullanıcı gizliliği nedeniyle sıkı kurallara tabidir. Android için AndroidManifest.xml, iOS için ise Info.plist dosyalarında gerekli izinleri tanımlamanız gerekir. Bu izinler olmadan işletim sistemi uygulamayı engelleyecektir.

Öncelikle, uygulamanın konum izni isteyip istemediğini kontrol eden ve kullanıcıdan izin isteyen bir servis sınıfı oluşturmalıyız. Aşağıdaki kod, modern Flutter mimarisinde izin yönetimini gösterir:

Future determinePosition() async {
  bool serviceEnabled;
  LocationPermission permission;

  serviceEnabled = await Geolocator.isLocationServiceEnabled();
  if (!serviceEnabled) return Future.error('Konum servisleri kapalı.');

  permission = await Geolocator.checkPermission();
  if (permission == LocationPermission.denied) {
    permission = await Geolocator.requestPermission();
    if (permission == LocationPermission.denied) return Future.error('İzin reddedildi.');
  }
  
  return await Geolocator.getCurrentPosition();
}

Restoran Verilerini API ile Çekme

Konum verisini (enlem ve boylam) elde ettikten sonra, bu veriyi Google Places API veya kendi sunucunuzdaki bir REST API'ye göndermeniz gerekir. Güvenlik açısından API anahtarlarınızı asla uygulama içine hard-coded (doğrudan kodun içine) yazmayın. Bunun yerine, çevresel değişkenler veya güvenli bir backend proxy kullanın.

Aşağıdaki örnek, elde edilen koordinatlarla bir restoran listesi çekmek için kullanılan asenkron HTTP isteğini göstermektedir:

Future fetchNearbyRestaurants(double lat, double lng) async {
  final url = Uri.parse('https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=$lat,$lng&radius=1500&type=restaurant&key=YOUR_API_KEY');
  final response = await http.get(url);
  
  if (response.statusCode == 200) {
    return json.decode(response.body)['results'];
  } else {
    throw Exception('Veri çekilemedi');
  }
}

Harita Üzerinde Restoranları İşaretleme

Verileri çektikten sonra, bunları Google Maps üzerinde işaretlemek (marker eklemek) kullanıcı deneyimi açısından kritiktir. Flutter'da GoogleMap widget'ı, dinamik olarak marker eklemeyi destekler. Her restoran için bir koordinat seti oluşturup haritaya eklemelisiniz.

Set _markers = {};

void _addMarkers(List restaurants) {
  for (var res in restaurants) {
    _markers.add(Marker(
      markerId: MarkerId(res['place_id']),
      position: LatLng(res['geometry']['location']['lat'], res['geometry']['location']['lng']),
      infoWindow: InfoWindow(title: res['name']),
    ));
  }
}

Yöntem Karşılaştırması: Konum Tabanlı Servisler

Yöntem Avantajı Dezavantajı
Google Places API Geniş veri tabanı, güncel bilgiler Maliyetli olabilir
OpenStreetMap (Nominatim) Ücretsiz, açık kaynak Veri kalitesi değişken
Kendi Veritabanı Tam kontrol, sıfır API maliyeti Veri güncelleme zorluğu

Güvenlik ve Performans İpuçları

Kritik Güvenlik Uyarısı: API anahtarlarınızı uygulama paketinde (APK/IPA) saklamayın. Üretim ortamında (production), isteklerinizi kendi backend sunucunuz üzerinden yönlendirin. Böylece API anahtarınızın çalınmasını önler ve istekleri filtreleyebilirsiniz. Ayrıca, SQL Injection riskine karşı sunucu tarafında her zaman parametreli sorgular kullanın.

Performans için, konum güncellemelerini sürekli çalıştırmak yerine, kullanıcı belirli bir mesafe (örneğin 500 metre) hareket ettiğinde tetikleyin. Bu, hem pil ömrünü korur hem de API maliyetlerini düşürür.

Sıkça Sorulan Sorular

Konum izni reddedildiğinde ne yapmalıyım?

Kullanıcıya iznin neden gerekli olduğunu açıklayan bir "Eğitici Diyalog" ekranı gösterin. Ayarlar sayfasına yönlendiren bir buton ekleyerek kullanıcının izni manuel olarak açmasını sağlayın.

API anahtarımı nasıl gizli tutabilirim?

Flutter projenizde flutter_dotenv paketini kullanın ve .env dosyasını .gitignore içerisine ekleyerek sürüm kontrol sistemine yüklenmesini engelleyin.

Uygulama arka planda çalışırken konum alabilir mi?

Evet, ancak bunun için background_locator_2 gibi ek paketler ve platforma özel (Foreground Service) yapılandırmalar gerekir. Bu işlem pil tüketimini ciddi oranda artırır.

Restoran verileri çok yavaş yükleniyor, ne yapabilirim?

Verileri çekerken "Pagination" (sayfalama) kullanın. İlk etapta sadece kullanıcının görüş alanındaki restoranları yükleyin, harita kaydırıldıkça yeni istekler atın.

Hangi harita sağlayıcısı daha uygun?

Eğer ticari ve global bir uygulama geliştiriyorsanız Google Maps, maliyet odaklı yerel bir uygulama geliştiriyorsanız Mapbox veya OpenStreetMap tercih edilebilir.

Uygulama Performansını Optimize Etme: "Geofencing" ve Veri Önbellekleme

Konum tabanlı uygulamalarda en büyük performans sorunu, her konum değişiminde API'ye istek gönderilmesidir. Bu durum hem pil tüketimini artırır hem de API maliyetlerini yükseltir. "Geofencing" (coğrafi çit) mantığı ile belirli bir yarıçapın dışına çıkılmadığı sürece API isteğini tetiklememek en sağlıklı yöntemdir.

Ayrıca, flutter_cache_manager veya hive gibi yerel depolama çözümleri kullanarak, daha önce çekilen restoran verilerini cihazda saklayabilirsiniz. Böylece kullanıcı uygulamayı tekrar açtığında, internet bağlantısı olmasa bile son görülen restoranları listeleyebilir.

// Hive ile basit veri önbellekleme örneği
import 'package:hive/hive.dart';

Future cacheRestaurants(List restaurants) async {
  var box = await Hive.openBox('restaurant_cache');
  await box.put('nearby_list', restaurants.map((e) => e.toJson()).toList());
}

Future getCachedRestaurants() async {
  var box = await Hive.openBox('restaurant_cache');
  return box.get('nearby_list');
}

Uygulama Hata Ayıklama ve Test Süreçleri

Konum tabanlı uygulamaları test etmek, fiziksel olarak sürekli hareket etmeyi gerektirmediği için geliştiriciler adına zorlayıcı olabilir. Android Studio ve Xcode'un sunduğu "Emulator Location" araçlarını kullanarak, uygulamanızın farklı koordinatlarda nasıl tepki verdiğini simüle etmelisiniz.

Test Senaryosu Oluşturma

  • İzin Reddi Testi: Kullanıcı konumu reddettiğinde uygulamanın çökmediğinden ve bir uyarı mesajı gösterdiğinden emin olun.
  • Düşük Bağlantı Testi: 3G veya zayıf Wi-Fi koşullarında API isteğinin zaman aşımına (timeout) düşüp düşmediğini kontrol edin.
  • Sanal Konum Değişimi: Emülatör üzerinden koordinatları değiştirerek, haritadaki pinlerin anlık güncellenip güncellenmediğini gözlemleyin.

Hata ayıklama sürecinde geolocator paketinin sunduğu PositionStream yapısını kullanarak konum değişimlerini loglayabilir ve uygulamanın arka planda konum verisi alıp almadığını debugPrint ile takip edebilirsiniz.

// Konum değişimlerini canlı izleme
Geolocator.getPositionStream(
  locationSettings: LocationSettings(
    accuracy: LocationAccuracy.high,
    distanceFilter: 10, // 10 metrede bir güncelle
  ),
).listen((Position position) {
  debugPrint("Yeni Konum: ${position.latitude}, ${position.longitude}");
  updateMapMarkers(position);
});

Deployment Öncesi Kontrol Listesi

Uygulamanızı Google Play Store veya Apple App Store'a yüklemeden önce şu teknik detayları mutlaka gözden geçirin:

  1. API Anahtarı Kısıtlamaları: Google Cloud Console üzerinden API anahtarınızı sadece uygulamanızın paket adına (package name) özel kısıtlayın.
  2. Gizlilik Politikası: Konum verisi topladığınızı belirten bir gizlilik politikasını uygulamanın mağaza sayfasına ekleyin.
  3. ProGuard/R8 Yapılandırması: Android tarafında kodunuzun güvenliği ve boyutu için proguard-rules.pro dosyanızı güncelleyin.

Sonuç

Flutter ve mobil teknolojilerle konum tabanlı bir restoran bulma servisi oluşturmak, doğru API yönetimi ve kullanıcı izni süreçleriyle oldukça verimli bir süreçtir. Bu rehberde, temel konum alma, API ile veri çekme ve harita üzerinde görselleştirme adımlarını öğrendiniz. Bir sonraki adım olarak, kullanıcıların restoranlara yorum yapabileceği veya favori listesi oluşturabileceği bir Firebase Realtime Database entegrasyonu ekleyerek uygulamanızı bir üst seviyeye taşıyabilirsiniz.

Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Uygulamanızı yayına almadan önce API sağlayıcılarının kullanım şartlarını okuyun ve veri güvenliği standartlarına (KVKK/GDPR) uygunluk sağlamak için bir siber güvenlik uzmanına danışın.

Bu yazıya tepkinizi paylaşın:
Emre Güneş

Teknik çözümler ve ev gereçleri kullanımı konusunda deneyimli bir editörüm. Kullanıcı hatalarını minimize eden, yalın ve çözüm odaklı rehberler hazırlıyorum.

Yorumlar (0)

Yorum Yaz