Bağlantı Yanılgısı
Mobil uygulama geliştirirken yüksek hızlı ofis ağından çalışmak, son kullanıcının her zaman stabil bir 5G bağlantısına sahip olduğunu varsaymak kolaydır. Ancak, uzaktaki çiftçileri desteklemek üzere tasarlanmış AgriTech platformları gibi gerçek dünya çözümleri oluştururken, ağ kopmaları, yavaş hızlar ve tamamen çevrimdışı kalma durumları varsayılan durumlardır, kenar durumları değil.
Eğer mobil uygulamanız, işlevselliği için API’den anlık HTTP yanıtlarına bağımlıysa, bu uygulama saha içerisinde başarısız olacaktır. Dayanıklı yazılımlar oluşturmak için, mobil frontend için Flutter ve güçlü bir senkronizasyon mekanizması ile Laravel backend kullanarak Offline-First bir deneyim mimarisi kurmalıyız.
Offline-First Paradigması
Offline-first mimarisinde, mobil uygulama yerel bir cihaz veritabanını asıl doğruluk kaynağı olarak kabul eder. Uygulama, bu yerel veritabanından anında okur ve yazar. Arka planda bir süreç, bu yerel verileri uzaktaki sunucu ile senkronize ederken, stabil bir bağlantı tespit edildiğinde bunu gerçekleştirir.
Aşama 1: Yerel Veritabanı (Flutter & SQLite)
Kullanıcı bir form gönderdiğinde (örneğin, günlük ürün verimi kaydı yaparken) doğrudan API çağrıları yapmak yerine, Flutter’da sqflite gibi bir paket kullanarak kaydı yerel olarak kaydediyoruz ve bunu sync_status ile etiketliyoruz.
// Flutter (Dart) - Öncelikle veriyi yerel olarak kaydetme
Future logCropYield(YieldData data) async {
final db = await DatabaseHelper.instance.database;
// İstemci tarafında benzersiz bir UUID üret
String localUuid = Uuid().v4();
await db.insert('crop_yields', {
'id': localUuid,
'crop_type': data.type,
'weight_kg': data.weight,
'recorded_at': DateTime.now().toIso8601String(),
'sync_status': 'pending_insert' // Arka planda senkronizasyon için işaretlendi
});
// Kullanıcı için, ağ durumu ne olursa olsun UI anında güncelleniyor!
notifyListeners();
}
Aşama 2: Arka Plan Senkronizasyon Motoru
Bir arka plan işçisi veya bağlantı dinleyicisi kullanarak, uygulama, pending_insert veya pending_update olarak işaretlenmiş kayıtları düzenli olarak kontrol eder. Ağ mevcut olduğunda, bu kayıtları gruplar ve Laravel API’sine gönderir.
// Flutter (Dart) - Senkronizasyon Süreci
Future syncWithServer() async {
if (await isNetworkAvailable()) {
final pendingRecords = await getPendingRecords();
if (pendingRecords.isNotEmpty) {
try {
// Laravel API'ye gruplu yük gönder
final response = await api.post('/sync/yields', data: pendingRecords);
if (response.statusCode == 200) {
// Yerelde senkronize olarak işaretle
await markRecordsAsSynced(pendingRecords);
}
} catch (e) {
// Başarısız olsa bile yerel verileri koruyarak işlemi tekrarlayacak
print("Senkronizasyon başarısız, yerel veriler korunuyor.");
}
}
}
}
Aşama 3: Backend’de Çatışma Çözümü (Laravel)
Offline-first tasarımının en zor kısmı çatışma çözümüdür. İki cihaz aynı kaydı çevrimdışı olarak güncelleyince hangi kaydın kazanacağı? Laravel backend’iniz bunu akıllıca yönetmelidir.
Otomatik artan tamsayılar yerine, istemci tarafından oluşturulan UUID’leri kullanıyoruz. Ayrıca, cihaz tarafından sağlanan updated_at zaman damgalarına dayanarak “Son Yazma Kazanır” stratejisi (ve iş kurallarına bağlı olarak daha karmaşık bir birleştirme mantığı) uyguluyoruz.
// Laravel Controller - Gelen senkronizasyon grubunu işleme
public function syncYields(Request $request)
{
$batch = $request->input('records'); // Flutter'dan gelen veri dizisi
DB::transaction(function () use ($batch) {
foreach ($batch as $record) {
CropYield::updateOrCreate(
['uuid' => $record['id']], // İstemcinin UUID'sini kullan
[
'crop_type' => $record['crop_type'],
'weight_kg' => $record['weight_kg'],
'recorded_at' => $record['recorded_at'],
]
);
}
});
return response()->json(['status' => 'synced']);
}
Sonuç
Offline-first uygulamalar inşa etmek, durum yönetiminde temel bir değişiklik gerektirir. UUID oluşturma, arka plan kuyruğu ve backend’de çatışma çözümlemesi gibi karmaşıklıkları beraberinde getirir. Ancak, tarım, lojistik veya saha mühendisliği gibi zorlu ortamlarda kullanıcılara hizmet eden ürünler için, “ağı beklerken” donmayan bir uygulama sunmak, en büyük rekabet avantajıdır.
Kaynak: Orijinal Makale


