← Tüm yazılar

Flutter'da çevrimdışı-öncelikli mimari: Benim Sınavım örneği

14 Mar 20261 dk okumaFlutterSupabase

Benim Sınavım'ın kullanıcıları soru çözmek için garip yerler seçer: servis, metro, köy, yurt kantini. Ortak noktaları internetin ya yavaş ya da hiç olmaması. Bu yüzden ilk günden bir kural koydum: uygulama internetsiz eksiksiz çalışacak; internet, senkronizasyon için bir bonus.

Önce yerel, sonra bulut

Mimarinin özü basit: tek doğruluk kaynağı cihazdaki veritabanı. Arayüz asla ağı beklemez; her zaman yerelden okur, yerele yazar. Ağ katmanı arka planda çalışan ayrı bir dünyadır.

Yazma işlemleri bir kuyruk üzerinden akar:

sync_queue.dart
Future<void> saveAnswer(Answer answer) async {
  // 1) Yerel veritabanına anında yaz; arayüz bunu görür
  await db.answers.put(answer);
 
  // 2) Kuyruğa senkron görevi ekle
  await db.syncQueue.put(SyncTask(
    type: SyncType.answer,
    payload: answer.toJson(),
    createdAt: DateTime.now(),
  ));
 
  // 3) Bağlantı varsa kuyruğu boşaltmayı dene; yoksa sonra
  unawaited(syncService.flush());
}

Bağlantı geldiğinde flush() kuyruğu sırayla Supabase'e gönderir. Kullanıcı bunun hiçbirini fark etmez; sorusunu çözer, istatistiği anında görür.

Çakışmalar: korkulduğu kadar değil

Çok cihazlı senkronda ilk akla gelen korku çakışmalardır. Pratikte veri modelini doğru seçince sorun küçülüyor:

Çevrimdışı-öncelikli mimari bir özellik değil, bir sözleşmedir: arayüz ağı hiç tanımaz.

Nelere dikkat etmeli?

Bu mimarinin bonusu beklemediğim bir yerden çıktı: uygulama internetli ortamda da hızlandı, çünkü hiçbir ekran ağ gecikmesi beklemiyor.

Murat Özdemir

Product Manager & mobil geliştirici. Ürün, performans ve iyi arayüzler üzerine yazıyor.