Flutter'da Canlı Harita ve Konum Tabanlı Servis Mimarisi Rehberi
Flutter mobil projelerinde Google Maps entegrasyonu, BLoC tabanlı konum dinleme, batarya optimizasyonu ve Clean Architecture rehberi.
Giriş: Konum Tabanlı Uygulamaların Yükselişi ve Flutter'ın Gücü#
Kurye takip, mikromobilite (scooter/bisiklet kiralama), araç çağırma ve saha yönetim uygulamalarında kullanıcı deneyiminin kalbi gerçek zamanlı konum doğruluğu ve akıcı harita render performansından geçer.
Flutter, tek bir Dart kod tabanıyla hem iOS hem de Android platformlarında 60/120 FPS akıcı harita çizimleri yapabilmesi, gelişmiş platform kanalları (Platform Channels) ve zengin ekosistemi sayesinde konum tabanlı projeler için endüstri standardı haline gelmiştir.
Bu rehberde; harita kütüphanelerinin entegrasyonu, BLoC tabanlı durum yönetimi, batarya tasarrufu sağlayan konum dinleme filtreleri ve Clean Architecture mimari katmanlarını ele alıyoruz.
1. Mimari Tasarım: Clean Architecture Katmanları#
Canlı konum verisini UI bileşenleri içinde doğrudan dinlemek (spaghetti kod), bellek sızıntılarına (memory leak) ve kontrolsüz batarya tüketimine yol açar. Bu yüzden sorumlulukları net olarak ayırıyoruz:
- Domain Katmanı:
LocationEntity,GetLiveLocationStreamUseCase,CalculateDistanceUseCase. Platformdan bağımsız saf iş mantığı. - Data Katmanı:
LocationRemoteDataSource(WebSocket/MQTT) veLocationLocalDataSource(Geolocator GPS servisi). - Presentation Katmanı: BLoC / Cubit ile gelen konum akışını harita üzerindeki marker ve polyline objelerine dönüştüren reaktif katman.
| 1 | // Domain: Saf Konum Modeli |
| 2 | class UserLocation { |
| 3 | final double latitude; |
| 4 | final double longitude; |
| 5 | final double heading; |
| 6 | final double speed; |
| 7 | final DateTime timestamp; |
| 8 | |
| 9 | const UserLocation({ |
| 10 | required this.latitude, |
| 11 | required this.longitude, |
| 12 | required this.heading, |
| 13 | required this.speed, |
| 14 | required this.timestamp, |
| 15 | }); |
| 16 | } |
2. Geolocator ile Optimize Edilmiş Konum Dinleme#
GPS modülü mobil cihazların en çok enerji harcayan donanımlarından biridir. Sürekli en yüksek hassasiyette (High Accuracy) konum istemek kullanıcının şarjını dakikalar içinde tüketebilir.
distanceFilter parametresi ile cihaz en az belirlenen metre kadar hareket etmedikçe yeni koordinat tetiklenmesini engelleyerek batarya kullanımını %40'a kadar optimize edebilirsiniz.| 1 | import 'dart:async'; |
| 2 | import 'package:geolocator/geolocator.dart'; |
| 3 | |
| 4 | class LocationService { |
| 5 | StreamSubscription<Position>? _positionStreamSubscription; |
| 6 | |
| 7 | Stream<Position> getLiveLocationStream({int distanceFilterMeters = 10}) { |
| 8 | final LocationSettings locationSettings = LocationSettings( |
| 9 | accuracy: LocationAccuracy.high, |
| 10 | distanceFilter: distanceFilterMeters, |
| 11 | ); |
| 12 | |
| 13 | return Geolocator.getPositionStream(locationSettings: locationSettings); |
| 14 | } |
| 15 | |
| 16 | Future<bool> checkAndRequestPermission() async { |
| 17 | bool serviceEnabled = await Geolocator.isLocationServiceEnabled(); |
| 18 | if (!serviceEnabled) { |
| 19 | return false; |
| 20 | } |
| 21 | |
| 22 | LocationPermission permission = await Geolocator.checkPermission(); |
| 23 | if (permission == LocationPermission.denied) { |
| 24 | permission = await Geolocator.requestPermission(); |
| 25 | if (permission == LocationPermission.denied) { |
| 26 | return false; |
| 27 | } |
| 28 | } |
| 29 | |
| 30 | if (permission == LocationPermission.deniedForever) { |
| 31 | return false; |
| 32 | } |
| 33 | |
| 34 | return true; |
| 35 | } |
| 36 | |
| 37 | void dispose() { |
| 38 | _positionStreamSubscription?.cancel(); |
| 39 | } |
| 40 | } |
3. BLoC ile Harita Durum Yönetimi#
Haritadaki kamera hareketi (CameraUpdate) ve marker rotasyonu, gelen konum akışına göre asenkron olarak güncellenmelidir.
| 1 | // map_bloc.dart |
| 2 | import 'package:flutter_bloc/flutter_bloc.dart'; |
| 3 | import 'package:google_maps_flutter/google_maps_flutter.dart'; |
| 4 | |
| 5 | abstract class MapEvent {} |
| 6 | class StartLiveTracking extends MapEvent {} |
| 7 | class LocationUpdated extends MapEvent { |
| 8 | final LatLng position; |
| 9 | final double heading; |
| 10 | LocationUpdated(this.position, this.heading); |
| 11 | } |
| 12 | |
| 13 | class MapState { |
| 14 | final LatLng? currentPosition; |
| 15 | final Set<Marker> markers; |
| 16 | final bool isTracking; |
| 17 | |
| 18 | const MapState({ |
| 19 | this.currentPosition, |
| 20 | this.markers = const {}, |
| 21 | this.isTracking = false, |
| 22 | }); |
| 23 | |
| 24 | MapState copyWith({ |
| 25 | LatLng? currentPosition, |
| 26 | Set<Marker>? markers, |
| 27 | bool? isTracking, |
| 28 | }) { |
| 29 | return MapState( |
| 30 | currentPosition: currentPosition ?? this.currentPosition, |
| 31 | markers: markers ?? this.markers, |
| 32 | isTracking: isTracking ?? this.isTracking, |
| 33 | ); |
| 34 | } |
| 35 | } |
4. Google Maps UI Entegrasyonu & Akıcı Kamera Hareketi#
Flutter widget ağacında haritayı render ederken GoogleMap denetleyicisini (controller) hafızada doğru yönetmek gerekir.
| 1 | class LiveMapScreen extends StatefulWidget { |
| 2 | const LiveMapScreen({super.key}); |
| 3 | |
| 4 | @override |
| 5 | State<LiveMapScreen> createState() => _LiveMapScreenState(); |
| 6 | } |
| 7 | |
| 8 | class _LiveMapScreenState extends State<LiveMapScreen> { |
| 9 | GoogleMapController? _mapController; |
| 10 | |
| 11 | void _onMapCreated(GoogleMapController controller) { |
| 12 | _mapController = controller; |
| 13 | } |
| 14 | |
| 15 | void _animateToPosition(LatLng position) { |
| 16 | _mapController?.animateCamera( |
| 17 | CameraUpdate.newCameraPosition( |
| 18 | CameraPosition(target: position, zoom: 16.5, tilt: 45.0), |
| 19 | ), |
| 20 | ); |
| 21 | } |
| 22 | |
| 23 | @override |
| 24 | Widget build(BuildContext context) { |
| 25 | return BlocConsumer<MapBloc, MapState>( |
| 26 | listener: (context, state) { |
| 27 | if (state.currentPosition != null) { |
| 28 | _animateToPosition(state.currentPosition!); |
| 29 | } |
| 30 | }, |
| 31 | builder: (context, state) { |
| 32 | return Scaffold( |
| 33 | body: GoogleMap( |
| 34 | initialCameraPosition: const CameraPosition( |
| 35 | target: LatLng(39.9334, 32.8597), // Ankara |
| 36 | zoom: 14.0, |
| 37 | ), |
| 38 | onMapCreated: _onMapCreated, |
| 39 | markers: state.markers, |
| 40 | myLocationEnabled: true, |
| 41 | myLocationButtonEnabled: false, |
| 42 | zoomControlsEnabled: false, |
| 43 | ), |
| 44 | ); |
| 45 | }, |
| 46 | ); |
| 47 | } |
| 48 | } |
5. Güvenlik ve Canlıya Alma Kontrol Listesi#
- API Kısıtlamaları: Google Cloud Console üzerinden harita API anahtarınızı hem Android (SHA-1 fingerprint & package name) hem de iOS (Bundle Identifier) ile sınırlandırın.
- İzin Açıklamaları: iOS için
Info.plistdosyasındaNSLocationWhenInUseUsageDescriptionveNSLocationAlwaysAndWhenInUseUsageDescriptionmetinlerini kullanıcıya şeffaf şekilde açıklayın. - Marker Kümeleme (Clustering): Haritada yüzlerce nokta gösterilecekse
flusterveyagoogle_maps_cluster_managerkütüphaneleriyle kümeleme yaparak UI donmalarını engelleyin.
Canlı harita ve konum mimarileri hakkında kurumsal veya özel projeniz için danışmanlık almak isterseniz iletişime geçebilirsiniz.
Flutter & Cross-Platform Mobil Uygulama Mühendisliği
iOS ve Android için Flutter ve Clean Architecture mimarisiyle sıfırdan anahtar teslim, yüksek performanslı ve mağaza garantili mobil uygulama geliştirme.
İlgili Çözüm Paketleri
1 Yıl Bakım Garantili Mobil Uygulama Şirketi: Nuh Mehmet Demirkol
Konya Teknik Üniversitesi mezunu Nuh Mehmet Demirkol liderliğinde, Flutter ve Next.js tabanlı, 1 yıl ücretsiz bakım garantili kurumsal mobil uygulama geliştirme hizmeti sunuyoruz. İşinizi dijital dünyaya taşırken, teknik borç içermeyen, sürdürülebilir ve yüksek performanslı mimariler inşa ediyoruz.
Ankara Mobil Uygulama Yapan Firmalar & Yazılımcı: NM Demirkol
Ankara'da yüz yüze toplantı yapabileceğiniz, resmi sözleşmeli ve faturalı çalışan, Flutter & Next.js uzmanı Bilgisayar Mühendisi Nuh Mehmet Demirkol ile projenizi güvenle hayata geçirin.
App Store & Google Play Yayınlama ve Onay Hizmeti | Demirkol
Google Play'in zorunlu kıldığı 20 test kullanıcısı 14 gün kuralı, Apple Developer D-U-N-S numarası ve katı mağaza inceleme yönergelerini aşarak uygulamanızı sıfır stresle yayına alıyoruz.
Flutter Mobil Uygulama Geliştirme Firması | Nuh Mehmet Demirkol
Konya Teknik Üniversitesi Bilgisayar Mühendisliği mezunu Nuh Mehmet Demirkol ile tek kod tabanından (Flutter & Dart) iOS ve Android için 60 FPS akıcılığında native performanslı mobil uygulamalar geliştirin. %100 kaynak kod mülkiyeti, 1 yıl bakım garantisi ve sıfır teknik borç.
Teknik Kılavuzlar & Blog
2026 Mobil Uygulama Yaptırma Maliyeti: A'dan Z'ye Fiyat Hesaplama ve Bütçe Rehberi
2026 yılı Android ve iOS mobil uygulama yaptırma fiyatları, Flutter vs Native maliyet analizi, sunucu & mağaza giderleri, admin panel bütçesi ve şeffaf maliyet hesaplama tablosu.
Flutter vs React Native vs Native Swift/Kotlin: 2026 Mobil Mimari ve Performans Karşılaştırması
Tek kod tabanıyla iki platforma çıkış, Clean Architecture, BLoC durum yönetimi, kasmayan akıcı UI, internetsiz (offline-first) çalışma ve CI/CD süreçleri.
Ankara Kurumsal Mobil Yazılım ve Dedicated Mühendislik: Sözleşmeli, Faturalı Yazılım Çözümleri
Ankara merkezli kurumsal mobil yazılım projeleri, Çankaya, ODTÜ Teknokent ve Çukurambar lokasyonlu yüz yüze teknik iş ortaklığı, ihale teklifleri ve dış kaynak yazılımcı kiralama.
İlgili Canlı Projeler
Konum Tabanlı Hazine Avcılığı Mobil Uygulaması
GPS ve canlı harita üzerinden kullanıcıların gerçek dünyada ipuçlarını takip ederek ödüller bulduğu etkileşimli mobil deneyim.
Bire Bir Özel Ders & Vücut Kitle Endeksi Uygulamaları
Google Play Store üzerinde yayınlanan, eğitim ve sağlık kategorilerinde kullanıcı dostu arayüzlere sahip pratik mobil uygulamalar.
Bu Konuda Projeniz mi Var?
Makalede bahsedilen mimari çözümleri, mobil veya modern web projenizde sıfır hata ve maksimum performansla hayata geçirmek için doğrudan iletişime geçebilirsiniz.