All Posts
FlutterHivePerformans

Flutter'da 64K Veri Noktasını Hive ile Cache'leme

20 Şubat 20268 dk

Problem

Skoryum AI'da her maç için REST API'den 64.328 x 8 veri noktası çekiyorduk. Bu yaklaşık 500KB+ JSON verisi demek ve her seferinde API çağrısı yapmak ciddi bir performans sorunu yaratıyordu:

  • İlk yükleme süresi: ~14 saniye
  • Her sayfa geçişinde yeniden fetch
  • Kullanıcı deneyimi berbat

Çözüm: Hive Cache Stratejisi

Flutter ekosisteminde Hive, key-value store olarak mükemmel bir seçim. SQLite'a göre çok daha hızlı ve Flutter'a özel tasarlanmış.

1. Cache Model Tanımlama

@HiveType(typeId: 0)
class MatchCache extends HiveObject {
  @HiveField(0)
  final String matchId;

  @HiveField(1)
  final List<double> predictions;

  @HiveField(2)
  final DateTime cachedAt;

  @HiveField(3)
  final int version;

  bool get isExpired =>
    DateTime.now().difference(cachedAt).inHours > 2;
}

2. Cache-First Strateji

class MatchRepository {
  final Box<MatchCache> _cache;
  final ApiClient _api;

  Future<MatchData> getMatch(String id) async {
    // 1. Cache'e bak
    final cached = _cache.get(id);
    if (cached != null && !cached.isExpired) {
      return MatchData.fromCache(cached);
    }

    // 2. API'den çek
    final data = await _api.fetchMatch(id);

    // 3. Cache'e yaz (arka planda)
    _cache.put(id, MatchCache(
      matchId: id,
      predictions: data.predictions,
      cachedAt: DateTime.now(),
      version: data.version,
    ));

    return data;
  }
}

3. Batch Pre-loading

Kullanıcı ana sayfaya girdiğinde, arka planda en olası maç verilerini önceden yüklüyoruz:

Future<void> preloadUpcomingMatches() async {
  final upcoming = await _api.getUpcomingMatchIds();

  await Future.wait(
    upcoming.take(10).map((id) => getMatch(id)),
  );
}

Sonuçlar

| Metrik | Önce | Sonra | |--------|------|-------| | İlk yükleme | 14s | 0.3s | | Sayfa geçişi | 3-5s | Anlık | | Veri boyutu | 500KB/istek | Cache'den | | API çağrısı | Her seferinde | 2 saatte 1 |

%97 performans artışı — kullanıcılar artık veriyi anlık görüyor.

Öğrenilen Dersler

  • Hive'ın LazyBox özelliği büyük veri setleri için harika
  • Cache invalidation stratejisi kritik — stale data göstermemek lazım
  • compute() ile arka plan thread'de JSON parse etmek UI freeze'i önlüyor