"Uygulama internetsiz çalışmıyor" — müşteri şikayetlerinin en yaygınlarından biri. Saha uygulamalarında, lojistikte ve kamu yazılımlarında çevrimdışı çalışma artık bir lüks değil, zorunluluk. Offline-first mimariyi gerçek bir kurumsal projede nasıl kurduğumu adım adım aktarıyorum.
Neden Offline-First?
Saha çalışanları bodrum katlarda, tünellerde, sinyal zayıf bölgelerde çalışır. Veri girişi yapamamak hem verimsizlik hem de güven kaybıdır. Offline-first mimaride uygulama her zaman yerel veriyle çalışır, ağ bağlantısı gelince senkronize eder.
Temel Bileşenler
1. Yerel Veritabanı (SQLite / Drift): Tüm CRUD işlemleri önce yerel DB'ye yazılır. Flutter'da drift paketi tip güvenli, reactive bir SQLite deneyimi sunar.
2. Sync Kuyruğu: Her işlem bir kuyruğa eklenir. Kuyruk arka planda çalışan bir WorkManager/background isolate ile periyodik olarak tükenir.
// Sync kuyruğu modeli
class SyncQueue {
final String id;
final String endpoint;
final String payload;
final DateTime createdAt;
int retryCount;
}3. Connectivity Listener: connectivity_plus paketi ile ağ durumu izlenir. Bağlantı gelince sync tetiklenir.
4. Conflict Resolution: Aynı kayıt hem yerel hem sunucuda değiştiyse çakışma olur. "Last write wins" basit ama riskli; "server wins" daha güvenli; karmaşık senaryolarda field-level merge gerekir.
Pratik İpuçları
- Her kaydın
updated_atvesync_status(pending/synced/failed) alanı olsun - Senkronizasyon sırasında UI'ı bloke etme — arka planda çalışsın
- Kullanıcıya senkronizasyon durumunu göster ("3 kayıt bekliyor")
- Retry logic ekle: exponential backoff ile 1s → 2s → 4s → 8s
- Büyük veri setlerinde delta sync (sadece değişen kayıtları) kullan
Test
Offline senaryoları test etmek için Android emülatörde ağı kesin, ardından açıp senkronizasyonu gözlemleyin. Airplane mode ile gerçek cihaz testleri de şart.
Sonuç
Offline-first mimari, baştan doğru kurulursa uygulamanın kalitesini ve kullanıcı güvenini dramatik biçimde artırır. Sonradan eklemek ise çoğu zaman sıfırdan yazmak kadar maliyetlidir — tasarım aşamasında karar verin.