Gereksinimler ve Ön Hazırlık
Flutter projelerinizde internet bağlantısını yönetmek için en güvenilir ve güncel yöntem connectivity_plus paketini kullanmaktır. Bu paket, cihazın ağ durumundaki değişiklikleri dinlemenize ve anlık durum bilgisi almanıza olanak tanır.
Projenize başlamadan önce aşağıdaki adımları takip ederek ortamınızı hazırlayın:
- Flutter SDK sürümünüzün 3.24 veya üzeri olduğundan emin olun.
pubspec.yamldosyanıza gerekli bağımlılığı ekleyin.- Android ve iOS için gerekli izin tanımlamalarını (Manifest ve Info.plist) yapılandırın.
Bağımlılığı eklemek için terminalinizde şu komutu çalıştırın:
flutter pub add connectivity_plus
Bu komut, projenize en güncel sürümü ekleyecek ve pubspec.yaml dosyanızı otomatik olarak güncelleyecektir.
Adım Adım: İnternet Bağlantısını Kontrol Etme
Uygulamanın açılışında mevcut bağlantı durumunu kontrol etmek için Connectivity sınıfının checkConnectivity() metodunu kullanırız. Bu metod, cihazın o anki ağ durumunu bir liste olarak döner.
import 'package:connectivity_plus/connectivity_plus.dart';
Future checkConnection() async {
final List connectivityResult = await (Connectivity().checkConnectivity());
if (connectivityResult.contains(ConnectivityResult.none)) {
print("İnternet bağlantısı yok.");
} else {
print("İnternet bağlantısı mevcut.");
}
}
Yukarıdaki kod, uygulamanın başladığı anda ağ durumunu sorgular. ConnectivityResult.none değeri, cihazın herhangi bir ağa bağlı olmadığını ifade eder.
Bağlantı Değişikliklerini Dinleme
Sadece açılışta kontrol yapmak yeterli değildir; kullanıcı uygulama içindeyken bağlantı kopabilir. Bunun için onConnectivityChanged stream yapısını kullanmalısınız. Bu yapı, ağ durumu her değiştiğinde tetiklenir.
import 'dart:async';
import 'package:connectivity_plus/connectivity_plus.dart';
late StreamSubscription subscription;
void startListening() {
subscription = Connectivity().onConnectivityChanged.listen((List result) {
if (result.contains(ConnectivityResult.none)) {
print("Bağlantı koptu!");
} else {
print("Bağlantı sağlandı: $result");
}
});
}
Bu kod bloğu, ağ durumundaki değişimleri sürekli dinler. Bellek sızıntılarını (memory leaks) önlemek için dispose() metodunda subscription.cancel() komutunu çağırmayı unutmayın.
İzin Tanımlamaları ve Güvenlik
Mobil işletim sistemleri, uygulamanın ağ durumunu sorgulaması için özel izinler talep eder. Bu izinleri tanımlamazsanız, kodunuz çalışsa bile sistemden doğru yanıt alamazsınız.
Kritik Uyarı: Android tarafındaandroid/app/src/main/AndroidManifest.xmldosyasınasatırını eklemediğiniz sürece ağ durumu sorgulamaları hata verecektir. iOS için iseInfo.plistdosyasında ağ izni yapılandırması genellikle otomatik yönetilir ancak ağ kısıtlamaları için dikkatli olunmalıdır.
Bağlantı Yöntemlerinin Karşılaştırılması
Aşağıdaki tablo, farklı bağlantı kontrol yöntemlerini ve kullanım amaçlarını özetlemektedir:
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Connectivity Plus | Hızlı, yerel API, pil dostu | Sadece ağın varlığını bildirir, internete çıkış olup olmadığını garanti etmez. |
| Internet Address Lookup | Gerçek internet erişimini doğrular | Daha fazla veri tüketir, gecikmeye neden olabilir. |
Gerçek İnternet Erişimi Kontrolü (Ping Yöntemi)
Bazen cihaz Wi-Fi'ye bağlı olabilir ancak modemde internet olmayabilir. Bu durumda connectivity_plus "bağlı" derken, aslında internet yoktur. Gerçek bir kontrol için bir sunucuya (örneğin google.com) ping atmak gerekir.
import 'dart:io';
Future hasInternetAccess() async {
try {
final result = await InternetAddress.lookup('google.com');
return result.isNotEmpty && result[0].rawAddress.isNotEmpty;
} on SocketException catch (_) {
return false;
}
}
Bu fonksiyon, bir DNS çözümlemesi yaparak internete çıkış olup olmadığını doğrular. SocketException hatası alırsanız, cihazın internet erişimi yoktur.
Sıkça Sorulan Sorular
Uygulamam neden bağlantı değişikliğini algılamıyor?
Manifest veya Info.plist dosyalarındaki izinlerin eksik olup olmadığını kontrol edin. Ayrıca, emülatörlerin bazen gerçek ağ durumlarını simüle etmekte zorlandığını unutmayın.
Bağlantı kontrolü için en iyi yer neresidir?
Uygulamanın ana ekranında veya main.dart içerisinde bir Provider veya Bloc yapısı kurarak tüm uygulamayı sarmalamak en temiz yöntemdir.
Ping yöntemi uygulamayı yavaşlatır mı?
Evet, sürekli ping atmak ağ trafiğini ve pil ömrünü olumsuz etkiler. Sadece kritik işlemlerden (ödeme, dosya yükleme vb.) önce bu kontrolü yapın.
Bağlantı koptuğunda kullanıcıya ne göstermeliyim?
Kullanıcıyı rahatsız etmeyecek bir SnackBar veya ekranın üst kısmında sabit bir "Çevrimdışı" banner'ı kullanmak en iyi pratiktir.
Hücresel veri ve Wi-Fi ayrımı önemli mi?
Eğer uygulamanız büyük dosya indirmeleri yapıyorsa, kullanıcının hücresel veri harcamasını engellemek için bağlantı türünü kontrol etmek (ConnectivityResult.mobile) profesyonel bir yaklaşımdır.
Güvenlik Sorumluluk Reddi: Bu makaledeki kod örnekleri ağ durumunu izlemek için tasarlanmıştır. Ağ üzerinden veri transferi yaparken her zaman HTTPS protokolünü kullanmalı ve hassas verileri şifreleyerek iletmelisiniz. İnternet bağlantısı kontrolü, güvenlik önlemlerinin yerini tutmaz.
İleri Düzey Senaryo: Bağlantı Durumuna Göre Veri Senkronizasyon Yönetimi
Gerçek dünya uygulamalarında internet bağlantısını kontrol etmek sadece bir "çevrimdışı" uyarısı göstermekten ibaret değildir. Kullanıcı internete bağlıyken arka planda bekleyen verileri sunucuya göndermek (sync), uygulamanın veri bütünlüğü için kritiktir. Bu senaryoda connectivity_plus ile gelen durumu bir Repository katmanında yönetmek en sağlıklı yaklaşımdır.
Aşağıdaki örnekte, bağlantı geldiği anda tetiklenen bir senkronizasyon mekanizmasının temel yapısını görebilirsiniz:
class SyncRepository {
final Connectivity _connectivity = Connectivity();
void listenToSync() {
_connectivity.onConnectivityChanged.listen((ConnectivityResult result) {
if (result != ConnectivityResult.none) {
_performBackgroundSync();
}
});
}
Future _performBackgroundSync() async {
// Burada yerel veritabanındaki (Hive/SQLite) bekleyen verileri
// sunucuya gönderen API çağrılarınızı tetikleyin.
print("İnternet algılandı, senkronizasyon başlatılıyor...");
}
}
Bağlantı Kontrolünde Performans ve Kaynak Yönetimi
Sürekli olarak ağ durumunu izlemek, özellikle düşük seviyeli cihazlarda pil tüketimini artırabilir. Performansı optimize etmek için şu stratejileri izlemelisiniz:
- Stream Aboneliklerini Yönetin:
onConnectivityChangedstream'ini birStreamSubscriptionnesnesine atayın vedispose()metodunda mutlakacancel()işlemini gerçekleştirin. Aksi takdirde bellek sızıntısı (memory leak) kaçınılmazdır. - Debounce Kullanımı: Bağlantı durumu çok hızlı değiştiğinde (örneğin asansöre girip çıkarken) uygulamanızın sürekli tetiklenmesini engellemek için
rxdartkütüphanesindekidebounceTimeoperatörünü kullanarak işlemleri belirli bir süre geciktirin. - Isolate Kullanımı: Eğer ping yöntemi ile çok sık kontrol yapıyorsanız, bu işlemleri ana UI thread'ini yormamak için
computefonksiyonu ile ayrı bir isolate içinde çalıştırmayı düşünün.
// Bellek sızıntısını önlemek için örnek
class ConnectionManager {
StreamSubscription? _subscription;
void startMonitoring() {
_subscription = Connectivity().onConnectivityChanged.listen((event) {
// İşlemler
});
}
void stopMonitoring() {
_subscription?.cancel();
}
}
Test Süreçleri ve Emülatör İpuçları
Uygulamanızın çevrimdışı modunu test etmek için fiziksel cihazınızın uçak modunu açmak pratik olsa da, geliştirme aşamasında daha hızlı yöntemler mevcuttur:
- Android Emulator: "Extended Controls" (üç nokta simgesi) -> "Cellular" sekmesi üzerinden sinyal gücünü "None" yaparak ağ durumunu anlık simüle edebilirsiniz.
- iOS Simulator: "Network Link Conditioner" ayarlarını kullanarak sadece interneti kesmekle kalmaz, aynı zamanda 3G veya yüksek gecikmeli (latency) bağlantıları da test edebilirsiniz.
- Unit Test:
connectivity_pluskütüphanesini mock'layarak (mockitoveyamocktailkullanarak), uygulamanızın farklı bağlantı senaryolarında (Wi-Fi'dan Hücresel Veriye geçiş gibi) nasıl tepki verdiğini test edebilirsiniz.
İpucu: Uygulamanızın "Çevrimdışı" ekranını tasarlarken, kullanıcının tekrar çevrimiçi olduğunda sayfayı manuel yenilemesine gerek kalmadan otomatik olarak içeriği yükleyen bir "Retry" (Yeniden Dene) mekanizması eklemek kullanıcı deneyimini %40 oranında artırır.
Sonuç
Flutter ile internet bağlantısı kontrolü yapmak, uygulamanızın profesyonellik seviyesini doğrudan etkileyen bir unsurdur. connectivity_plus paketi ile anlık durum değişimlerini dinlemek ve ihtiyaç duyulduğunda InternetAddress.lookup ile gerçek erişimi doğrulamak, kullanıcılarınıza kesintisiz bir deneyim sunmanızı sağlar. Bir sonraki adım olarak, bu bağlantı durumunu bir State Management (Bloc veya Riverpod) yapısına entegre ederek, tüm uygulama genelinde çevrimdışı modları yöneten bir mimari kurabilirsiniz.


Yorumlar (0)
Yorum Yaz