Flutter’da Hive Kullanımı

Avni Bilal DEMİRTAŞ
Flutter Students Club
4 min readSep 27, 2022

Herkese merhaba, hatırı sayılır bir aradan sonra projelerimde sıklıkla kullandığım hive eklentisini elimden geldiğince size aktarmaya çalışacağım. Keyifli ve bol kodlu okumalar dilerim.

Hive Nedir?

Hive temelde bir NoSQL lokal veritabanıdır. Performans açısından oldukça hızlı olması, özel şifreleme yöntemi ile verileri saklaması, dart dili ile yazıldığından dolayı herhangi bir yerel bağımlılık içermemesi ve özelleştirilmiş modelleri saklayabilme gücü başlıca tercih edilme nedenleridir. Eğer projenizdeki veritabanınız key-value kullanımına uygun bir yapıda ise hive oldukça uygun bir lokal veritabanı çözümü olabilir.

Çalışma Yapısı

Hive kutu yapısı ile çalışan bir lokal database çözümüdür. Bundan dolayı kullanırken öncelikle initialize etmeli ardından da kullanmak istediğimiz kutuları açmalıyız. Sonrasında ise isimlerle özelleştirdiğimiz kutuların içine verilerimizi ekleyebilir, güncelleyebilir veya silebiliriz.

Kurulum

Öncelikle proje için gerekli olan hive_flutter, build_runner ve hive_generator eklentilerini pub.dev sitesinden pubspec.yaml dosyasına dahil ediyoruz.

Hive Dart dili ile yazıldığından dolayı eklentileri pubspec.yaml dosyasına ekledikten sonra android ve iOS tarafında özel bir işlem yapmamız gerekmiyor. Bu sayede hızlı bir şekilde kodlama kısmına geçebiliriz.

Temel Fonksiyonlar

Hive oldukça basit bir fonksiyon setine sahiptir. Bu fonksiyon setleri ile işlemlerin çoğunu rahatlıkla yapabiliriz. Kısaca özetleyecek olursak:

1- Hive.initFlutter() fonksiyonu ile kullanım öncesi Hive eklentisini projemizde tanımlar ve kurmuş oluruz. (main.dart dosyasında runApp fonksiyonundan önce tanımlamak uygun olacaktır)

2- Hive.openBox(boxName) fonksiyonu ile özel olarak isimlendirdiğimiz kutuları açarız.

3- Hive.box(boxName) fonksiyonu ile kullanmak istediğimiz kutu için nesne üretiriz.

4- _box.add(value) fonksiyonu ile kutunun içine sıralı olarak veri ekleriz.

5- _box.put(key, value) fonksiyonu ile fonksiyonun içine tanımlayacağımız özel anahtara veri ekleriz. (eğer bir veri varsa veriyi güncelleriz)

6- _box.get(key) fonksiyonu ile fonksiyonun içine tanımlayacağımız özel anahtardaki veriyi alırız.

7- _box.delete(key) fonksiyonu ile fonksiyonun içine tanımlayacağımız özel anahtardaki veriyi sileriz.

8- _box.clear() fonksiyonu ile kutunun içindeki verilerin tamamını sileriz.

9- _box.close() fonksiyonu ile kutuyu kapatırız.

Yukarıda örneği verilen fonksiyonlar sayesinde herhangi bir özel işlem yapmadan Dart dilinin temel veri tipleri olan String, int, bool gibi veri tiplerini kaydedebiliriz. Ancak özel bir model kaydetmek istediğimizde bir takım ek işlemler yapmamız gerekecektir.

Custom Model Kaydetme

Eğer özel bir modeli lokal veritabanımızda kayıt edeceksek oluşturduğumuz özel modelin başına @HiveType(typeId: …) ibaresini eklemeliyiz. Boş bırakılan alana ise bağımsız bir integer değer vermeliyiz (Bu değer başka bir özel modelle aynı değere sahip olmamalıdır). Ardından model içinde yer alan ve veritabanına kaydedeceğimiz her bir değer için, değerin başına @HiveField(…) ibaresini parantezin içine sıfırdan başlayarak sıralı bir şekilde numaralandıracak şekilde eklemeliyiz. Son olarak model dosyamızın en üstüne part ‘model_name.g.dart’; kodunu eklemeliyiz.

Yaptığımız bu değişiklikler ile modelimizi hive için uygun bir formata dönüştürmüş olduk. Modelimizi uygun formata dönüştürdükten sonra aşağıda yer alan kodu çalıştırarak hive_generator ve build_runner eklentilerinin veritabanına modeli kaydetmemiz için gereken kod partikülünü oluşturmasını sağlayacağız.

flutter pub run build_runner build

model_name.g.dart dosyası oluştuktan sonra hive eklentisine kaydedeceğimiz modelin özel bir model olduğunu ve özel elemanlar barındırdığını bildirmek için Hive.registerAdapter(…) fonksiyonunu kod yapımıza eklemeliyiz.

Not: Kod yapımıza registerAdapter fonksiyonunu eklerken openBox fonksiyonundan önce eklediğimizden emin olmalıyız. Aksi takdirde hata almamız muhtemel olacaktır.

Generic Class

Şu ana kadar yaptıklarımız hive eklentisinin gücünü kullanmak için yeterli idi. Ancak bunun biraz daha ötesine geçmek ve kendimizi de geliştirmek adına Generic Sınıf ve enum gücünü de kullanarak daha otomatize bir yapı kuralım ve bu oluşturduğumuz sistemi tüm uygulamalarımıza daha hızlı adapte etme gücüne sahip olalım.

Yukarıdaki kod bloğunda oluşturduğum repo için örnek olarak kullandığım bazı fonksiyonları generic class içerisine fonksiyon olarak tanımladım. Ayrıca kod okunaklığını artırmak ve isimlendirmeleri otomatize etmek adına enum oluşturmayı tercih ettim. Bazı fonksyionları ise (delete, clear) örnek uygulamada kullanmayacağım için tanımlamadım.

Yukarıda yer alan kod bloğunda ise kurduğum generic yapının bir kullanım örneğini oluşturdum. Bu örnekten yola çıkarak ister var olan projede isterseniz kendi projenizde kendi ihtiyacınıza göre fonksiyonları tanımlayabilir, geliştirebilir ve oluşturduğunuz nesneler aracılığıyla özgürce sürecinizi yönetebilirsiniz.

Aşağıda yer alan linklerde oluşturduğum örnek uygulamanın kaynak kodlarına ve sunuma, proje içerisinde kullandığım eklentilere ve yararlandığım kaynaklara erişebilirsiniz. Değerli vaktinizi ayırarak yazıyı okuduğunuz için teşekkür ederim. Bir sonraki yazıda görüşmek üzere.💙

--

--