Flutter'da çevrimdışı-öncelikli mimari: Benim Sınavım örneği
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:
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:
- Cevap kayıtları yalnızca eklenir (append-only); çakışma diye bir şey yok.
- İstatistikler cevaplardan türetilir; senkron sonrası yeniden hesaplanır.
- Kullanıcı ayarları gibi az sayıdaki gerçek çakışma adayında kural basit: son yazan kazanır, zaman damgası cihaz saatine değil sunucu saatine göre.
Çevrimdışı-öncelikli mimari bir özellik değil, bir sözleşmedir: arayüz ağı hiç tanımaz.
Nelere dikkat etmeli?
- Kuyruk görevlerini idempotent tasarla; aynı görev iki kez işlenirse sonuç değişmemeli.
- Senkron durumunu kullanıcıya sessizce göster (küçük bir simge yeter); "verilerim gitti mi?" endişesi güveni bitirir.
- İlk kurulumda içerik paketini indirip yerelde tut; "ilk açılışta internet şart" demek çevrimdışı sözünü baştan bozmak olur.
Bu mimarinin bonusu beklemediğim bir yerden çıktı: uygulama internetli ortamda da hızlandı, çünkü hiçbir ekran ağ gecikmesi beklemiyor.
Product Manager & mobil geliştirici. Ürün, performans ve iyi arayüzler üzerine yazıyor.