SharedPreferences mı, Hive mı? Flutter Uygulaman İçin En Uygun Seçeneği Bul

SharedPreferences ve Hive kullanımı, performans, yapı ve kullanım kolaylığı açısından karşılaştırmalı analiz.


Flutter ile mobil uygulama geliştirirken karşımıza en sık çıkan ihtiyaçlardan biri, veri saklama. Kullanıcının tema tercihinden, oturum bilgisine, en son gezdiği sayfadan, favori içeriklerine kadar küçük verileri uygulama içinde saklamamız gerekiyor.

Bu noktada en çok duyduğumuz iki yapı:
SharedPreferences
Hive

Peki ikisi arasında fark ne?
Neden bazı geliştiriciler SharedPreferences yerine Hive kullanıyor?
Senin projen için hangisi daha doğru seçim?

Bu yazıda bu iki yapıyı hem teknik hem pratik yönleriyle karşılaştıracağız.
Ayrıca kullanımlarına dair sade örneklerle, hangisinin nerede tercih edilmesi gerektiğini açıkça göreceksin. Hedefim şu:
Yazının sonunda, SharedPreferences ve Hive’ı tüm yönleriyle anlamış ve projen için doğru kararı verebilir hâlde olacaksın.

Hazırsan başlayalım!

SharedPreferences Nedir?

SharedPreferences, Flutter uygulamalarında basit ve küçük verileri cihazda kalıcı olarak saklamak için kullanılan bir yapıdır. Android ve iOS tarafında native olarak desteklenen NSDefaults ve SharedPreferences API’lerini kullanır. Bu yapı, genellikle kullanıcı tercihlerini veya oturum bilgilerini tutmak gibi basit işlemler için tercih edilir.

SharedPreferences ile yalnızca belirli veri tipleri saklanabilir. Bunlar genellikle ilkel (primitive) veri tipleridir:

  • String
  • int
  • double
  • bool
  • List<String>

Veriler, key-value (anahtar-değer) mantığıyla saklanır. Uygulama kapatılsa bile bu veriler silinmez, kullanıcı manuel olarak uygulamayı temizlemediği sürece kalır.

Ne zaman kullanılmalı?

  • Kullanıcının tema tercihi (örneğin koyu mod)
  • Oturum açık mı değil mi bilgisinin saklanması
  • Kullanıcının en son girdiği kullanıcı adı
  • Dil tercihi gibi ayarlar

Avantajları

  • Kurulumu ve kullanımı oldukça basittir
  • Uygulama içi ayar verileri için yeterlidir
  • Platform desteği geniştir

Kısıtlamaları

  • Sadece temel veri tiplerini saklayabilir
  • Karmaşık veri yapılarını (örneğin liste içinde model sınıfı) doğrudan kaydedemez
  • Performansı büyük veri yapıları için uygun değildir
  • Veriler JSON olarak değil, native olarak saklanır ve genişletilebilirlik sınırlıdır

Örnek Kullanım

dependencies:
shared_preferences: ^2.5.3. //versiyon numarası değişiklik gösterebilir
final prefs = await SharedPreferences.getInstance();

// Veri kaydetme
await prefs.setBool('isLoggedIn', true);

// Veri okuma
final isLoggedIn = prefs.getBool('isLoggedIn') ?? false;

SharedPreferences, yapı olarak son derece basit ama sınırları belli bir çözümdür. Daha karmaşık veri yapıları gerektiğinde yetersiz kalabilir. Böyle bir durumda alternatiflere yönelmek gerekir. İşte burada Hive devreye giriyor.

Hive Nedir?

Hive, Flutter için geliştirilmiş, hafif ve yüksek performanslı bir NoSQL veritabanıdır. Flutter ile tam uyumlu çalışır ve özellikle mobil uygulamalarda yerel veri saklamak isteyen geliştiriciler için güçlü bir alternatiftir.

SharedPreferences yalnızca basit veri türlerini saklarken, Hive ile hem bu basit türleri hem de daha karmaşık nesne yapıları (model sınıfları gibi) kolayca saklamak mümkündür. Hive’ın en büyük avantajlarından biri, tip güvenliğini ve performansı birlikte sunmasıdır.

Veriler, cihazın dosya sisteminde saklanır. Ancak bu dosyalar, geliştirici tarafından değil Hive tarafından yönetilir. Hive, verileri kutular (boxes) içinde saklar ve bu kutular anahtar-değer sistemiyle çalışır.

Ne zaman kullanılmalı?

  • Karmaşık veri yapıları (örneğin tarifler, ürün listeleri, kullanıcı profilleri) saklanacaksa
  • Büyük miktarda yerel veriyle çalışılıyorsa
  • Okuma/yazma işlemlerinin hızlı olması önemliyse
  • Offline çalışacak uygulamalar geliştiriliyorsa

Avantajları

  • Performansı oldukça yüksektir
  • Model sınıfları ve karmaşık veri yapıları desteklenir
  • Tip güvenliği sunar
  • Offline-first uygulamalar için uygundur
  • Kod içinde kolay test edilebilir

Kısıtlamaları

  • İlk kurulumu ve yapılandırması SharedPreferences’a göre biraz daha karmaşıktır
  • Model sınıflarını kaydedebilmek için adaptör (adapter) yazmak gerekir
  • JSON formatında çalışmaz, kendi ikili veri formatını kullanır
  • Veri şifreleme istendiğinde ek yapılandırma gerekebilir

Örnek Kullanım

Kurulum:

dependencies:
hive: ^2.2.3
hive_flutter: ^1.1.0 //Versiyon numaraları değişiklik gösterebilir

dev_dependencies:
hive_generator: ^2.0.0
build_runner: ^2.3.3. //Versiyon numaraları değişiklik gösterebilir

Model tanımı:

import 'package:hive/hive.dart';

part 'user.g.dart';

@HiveType(typeId: 0)
class User extends HiveObject {
@HiveField(0)
String name;

@HiveField(1)
int age;

User({required this.name, required this.age});
}

Veri kaydetme ve okuma:

var box = await Hive.openBox<User>('users');

final user = User(name: 'Ali', age: 25);
await box.add(user);

final storedUser = box.getAt(0);
print(storedUser?.name);

Hive, özellikle verinin yapısal olduğu senaryolarda büyük kolaylık sağlar. Kendi nesnelerinizi saklayabildiğiniz için kodunuzu daha okunabilir ve sürdürülebilir kılar.

SharedPreferences vs Hive: Hangi Durumda Hangisi?

Flutter’da veri saklama ihtiyacı oluştuğunda, SharedPreferences ve Hive arasında tercih yaparken bazı kriterlere dikkat etmek gerekir. Aşağıda iki yapının belirli başlıklar altındaki farklarını bulabilirsin:

1. Veri Tipi Desteği

  • SharedPreferences yalnızca StringintbooldoubleList<String> gibi basit veri tiplerini destekler.
  • Hive ise hem bu basit veri tiplerini hem de model sınıflarını (örneğin User, Product gibi) destekler.

2. Performans

  • SharedPreferences küçük veri miktarlarında hızlıdır ancak büyük veri ve sık erişim gerektiren durumlarda yavaşlayabilir.
  • Hive, yüksek performanslıdır ve büyük veri setleriyle çalışırken bile hızlıdır.

3. Yapılandırma ve Kullanım Kolaylığı

  • SharedPreferences, kurulum ve kullanım açısından çok basittir. Ekstra yapılandırma gerekmez.
  • Hive, kurulumu biraz daha karmaşıktır. Model saklanacaksa adapteroluşturmak gerekir.

4. Offline Kullanım ve Veritabanı Özellikleri

  • SharedPreferences, daha çok kullanıcı ayarları gibi basit veriler için uygundur.
  • Hive, offline çalışacak uygulamalarda veritabanı gibi kullanılabilir.

5. Dosya Yapısı ve Saklama Şekli

  • SharedPreferences, platforma özel dosya sistemlerinde XML veya benzeri yapı kullanarak veri saklar.
  • Hive, kendi ikili formatını kullanır, bu da hem yer tasarrufu hem de hız sağlar.

6. Tip Güvenliği

  • SharedPreferences, dinamik tiplerle çalışır. Veriyi alırken tür kontrolü yapılmalı.
  • Hive, tip güvenliği sunar. Model nesneleriyle çalışmak daha güvenlidir.

7. Şifreleme ve Güvenlik

  • SharedPreferences verileri düz metin olarak saklar, ek güvenlik önlemi alınmazsa açıktır.
  • Hive, verileri şifreleyerek saklayabilir (ek yapılandırma ile).

8. Güncelleme ve Bakım

  • SharedPreferences, uzun süredir kullanılan bir yapı olduğu için stabil ama sınırlıdır.
  • Hive, daha yeni ve aktif şekilde geliştirilen bir pakettir, topluluk desteği güçlüdür.

Hangi Durumda Hangisi Kullanılmalı?

Senaryo 1: Tema Tercihini Saklama (Açık/Koyu Mod)
Kullanıcı uygulamayı en son açık mı yoksa koyu modda mı kullandı? Bu tercihi kaydedip uygulama yeniden açıldığında ona göre başlatmak istiyorsun.

SharedPreferences bu senaryo için idealdir. Sadece bir bool değer saklanacaksa basit, hızlı ve yeterlidir.

Senaryo 2: Kullanıcı Oturumu Saklama
Kullanıcı giriş yaptıktan sonra, oturumu kapatmadığı sürece uygulama ona giriş ekranı göstermesin istiyorsun. Oturum durumunu kaydetmen gerekiyor.

Yine SharedPreferences yeterlidir. Oturum bilgisi basit bir bool ya da token değeri ise kolayca saklanabilir.

Senaryo 3: Tarif Listesi veya Nesne Saklama
Uygulamada kullanıcının oluşturduğu tarifleri veya notları cihazda saklamak istiyorsun. Tariflerin başlığı, içeriği, puanı gibi alanları var. Hepsi bir model sınıfı içinde tutuluyor.

Bu durumda Hive kullanmak doğru tercih olur. Çünkü SharedPreferencesliste içinde nesne saklayamaz, ancak Hive ile model sınıfları tanımlayıp doğrudan saklayabilirsin.

Senaryo 4: Offline Çalışacak Uygulama
Kullanıcıların veri bağlantısı olmasa bile uygulamadaki içeriklere erişmesini istiyorsun. Örneğin, bebek tarifleri uygulamasında verilerin offline da çalışması isteniyor.

Bu durumda Hive daha uygundur. NoSQL yapısı sayesinde büyük verileri hızlıca okuyabilir ve offline-first mimariye uygundur.

Senaryo 5: Kullanıcının Favori Öğelerini Saklama
Kullanıcı birden fazla ürünü/favoriyi seçiyor. Bu veriler sade yapıda bir liste veya ID listesi olabilir.

Veri karmaşık değilse SharedPreferences kullanılabilir. Ancak her öğeye ait başka bilgiler de varsa (örneğin isim, kategori, tarih gibi), Hive daha uygun olur.

Senaryo 6: Uygulamanın İlk Kez Açılıp Açılmadığını Anlama
Uygulama ilk açıldığında onboarding gösterilsin, sonrakilerde geçilsin.

Bu tür basit durumlar için SharedPreferences yeterlidir. Uygulama ilk kez açıldı mı bilgisi tek bir boolean değerle kontrol edilebilir.

Her senaryoda ihtiyacın olan veri yapısına ve veri miktarına bakarak karar vermek en sağlıklı yöntemdir. Karmaşıklaşan veri yapılarında, uygulamanın offline çalışması gerektiği durumlarda veya performans kritikse, Hive uzun vadede daha güçlü bir çözüm sunar.

SharedPreferences’tan Hive’a Geçerken Nelere Dikkat Edilmeli?

Uygulamanı ilk geliştirirken SharedPreferences kullanmış olabilirsin. Ancak zamanla veri yapılarının karmaşıklaştığını ve artık bu yapının seni sınırladığını fark edebilirsin. Bu durumda Hive’a geçiş iyi bir çözüm olabilir. Fakat geçiş yaparken dikkat edilmesi gereken bazı önemli noktalar var:

1. Veri Modelini Tasarlamak Gerekiyor
Hive ile nesne tabanlı veri saklamak için önce model sınıfları oluşturmalısın. Bu sınıflar @HiveType ve @HiveFieldanotasyonlarıyla işaretlenir. Ayrıca her model için bir adapter yazılması gerekir. Bu yapı, veri yapısının açık ve tutarlı olmasını sağlar ama başlangıçta biraz hazırlık ister.

2. build_runner ve hive_generator Kullanımı
Hive adapter’larını otomatik oluşturmak için build_runner ve hive_generatorpaketlerini projene eklemelisin. Kod jenerasyonu sırasında dosya isimlendirmelerine dikkat etmek, part tanımlamalarını doğru yapmak gerekir.

3. Eski Verilerin Aktarımı (Opsiyonel)
SharedPreferences’taki verileri Hive’a taşımak istiyorsan, uygulaman ilk çalıştığında bu verileri alıp Hive kutularına yazacak bir geçiş kodu yazabilirsin. Örneğin:

final prefs = await SharedPreferences.getInstance();
final token = prefs.getString('auth_token');

final box = await Hive.openBox('settings');
await box.put('auth_token', token);

// Eski veriyi sil
await prefs.remove('auth_token');

Bu geçiş adımını sadece bir kez çalıştırabilir, ardından SharedPreferences kullanımını tamamen kaldırabilirsin.

4. Hive.init veya Hive.initFlutter Kullanımı
Hive’ı kullanmadan önce mutlaka başlatman gerekir. Mobil uygulamalarda genellikle Hive.initFlutter() kullanılır ve bu kod main() fonksiyonunda runApp() çağrısından önce yazılmalıdır.

5. Async Kutularla Çalışmak
Hive kutuları async olarak açılır. Bu yüzden uygulamanın state yönetimi içinde ya da FutureBuilder gibi yapılarla kutuların hazır olduğunu kontrol etmek gerekir.

6. Veritabanı Yapısını Önceden Planlamak
Hive, SQL tabanlı olmadığı için veri ilişkilerini düşünerek değil, veri yapısını iyi planlayarak kullanılmalıdır. Yani ilişkisel değil, doküman tabanlı bir yapı gibi düşünülmelidir.

7. Uygulama Boyutuna Etkisi
Hive ekstra bazı bağımlılıklarla birlikte gelir. Uygulamanın boyutunda küçük bir artış olabilir. Ancak bu genellikle performans ve esneklik kazanımıyla dengelenir.

Eğer geçişi doğru planlar ve uygulamanın ihtiyacına uygun veri yapısını kurarsan, Hive kullanmak çok daha sürdürülebilir bir çözüm sunar.

Özetle Hangi Aracı Ne Zaman Kullanmalı?

Flutter ile uygulama geliştirirken, veri saklama konusu proje ilerledikçe önem kazanan bir alan. Başta küçük ihtiyaçlar için hızlıca çözüm sunan SharedPreferences, birçok durumda yeterli olabilir. Ancak veri yapıları karmaşıklaştığında, esneklik ve performans gerektiğinde ya da offline çalışacak daha gelişmiş bir yapı kurmak istendiğinde, Hive çok daha güçlü bir çözüm haline gelir.

Bu yazıda iki yapının da ne işe yaradığını, nasıl çalıştığını ve hangi durumlarda kullanılmaları gerektiğini detaylı şekilde inceledik. Uygulamanın ihtiyaçlarını doğru analiz edip, uzun vadede bakım ve gelişime en uygun olan yapıyı tercih etmek her zaman en sağlıklı yoldur.

Eğer hala karar vermekte zorlanıyorsan, küçük projelerde SharedPreferences ile başlayıp ihtiyaç büyüdüğünde Hive’a geçmek de uygulanabilir bir yöntemdir. Önemli olan, kullandığın yapıyı gerçekten anlamak ve doğru yerde kullanabilmektir.

Buraya kadar okuduğun için teşekkür ederim. Umarım kapsamlı bir karşılaştırma olmuştur.

Yazımı beğendiysen clap tuşuna basmayı ve diğer içeriklerimden haberdar olabilmek için beni takip etmeyi unutma.

Teşekkürler.

Selin.