Flutter Uygulamalarında Dependency Injection: GetIt ve Injectable Kullanımı
Dependency Injection (DI), modern yazılım geliştirmede çok önemli bir tasarım kalıbıdır. Yazılım bileşenleri arasındaki bağımlılıkları yönetmek ve kodu daha modüler, test edilebilir hale getirmek için kullanılır. Flutter uygulamalarında, DI özellikle büyük projelerde kodun sürdürülebilirliği ve ölçeklenebilirliği açısından kritik bir rol oynar.
Bu yazıda, Flutter projelerinde DI kullanmanın faydalarını inceleyecek, GetIt ve Injectable paketlerinin nasıl entegre edileceğini gösterecek ve her iki paketle nasıl verimli bir DI yönetimi sağlayabileceğinizi ele alacağız.
Dependency Injection Nedir?
Dependency Injection, bir sınıfın ihtiyaç duyduğu bağımlılıkların (örneğin servisler, veritabanı erişimi vb.) o sınıfa dışarıdan sağlanması prensibine dayanır. Bir sınıfın bağımlılıklarını kendisinin oluşturmaması, dışarıdan sağlanan bağımlılıklarla çalışması, sınıfın daha bağımsız ve test edilebilir olmasını sağlar.
Örneğin, bir Flutter uygulamasında API servislerini, veritabanı bağlantılarını ya da farklı iş katmanlarını, DI kullanarak yönettiğinizde, bu bileşenler arasında sıkı bir bağlılık (tight coupling) oluşmaz ve bu sayede bir bileşeni değiştirmek veya test etmek çok daha kolay olur.
Flutter'da Dependency Injection
Flutter’da DI uygulamak için çeşitli yaklaşımlar vardır. En popüler yaklaşımlardan biri Service Locator Pattern’dir. Bu desenle, bağımlılıkları merkezi bir yerden yönetebilir ve ihtiyaç duyulan yerlerde rahatça erişim sağlayabilirsiniz. Flutter’da DI için en çok kullanılan iki paket:
- GetIt: Flutter için popüler bir service locator ve DI yönetimi için kullanılır.
- Injectable: GetIt ile entegre çalışarak bağımlılıkların otomatik olarak oluşturulmasını sağlayan bir araçtır.
GetIt ile Dependency Injection
GetIt, Flutter uygulamalarında en çok tercih edilen DI çözümlerinden biridir. Service Locator desenini kullanır ve bağımlılıkları yönetmeyi oldukça basitleştirir.
GetIt Nasıl Kurulur?
Projeye GetIt eklemek için pubspec.yaml
dosyasına şu satırı ekleyin:
pubspec.yaml
dependencies:
get_it: ^7.2.0
Daha sonra terminalden bu komut ile paketi kurabilirsiniz: flutter pub get
GetIt Kullanımı
Öncelikle GetIt’in nasıl çalıştığını anlamak için bir örnek üzerinde ilerleyelim. Örneğin, bir AuthService sınıfınız olduğunu varsayalım. Bu servisi uygulamanın genelinde kullanmak istiyorsunuz.
- AuthService Sınıfı:
- GetIt’i Kayıt Etme ve Kullanma:
Uygulamanın başlangıcında GetIt üzerinde servisleri kaydetmemiz gerekir. Bunu genellikle main.dart
dosyasında yaparız:
Burada, registerLazySingleton
, AuthService
'i uygulama boyunca bir kere oluşturarak ihtiyaç duyulduğunda aynı örneği sağlar. setup
fonksiyonunda bağımlılıkları kaydediyoruz, sonra uygulamayı başlatıyoruz.
- GetIt ile Servisi Kullanma:
Şimdi uygulamanın herhangi bir yerinde AuthService
’i kullanabilirsiniz:
Bu kadar basit! getIt
ile istediğiniz servisi çağırıp kullanabilirsiniz.
Injectable ile GetIt Entegrasyonu
Injectable, GetIt ile çalışmayı daha da kolaylaştıran bir araçtır. Özellikle projede birçok bağımlılık olduğunda, manuel olarak bağımlılıkları kaydetmek yerine Injectable ile otomatik olarak bağımlılıkları tanımlayabilirsiniz.
Injectable Nasıl Kurulur?
Öncelikle pubspec.yaml
dosyasına Injectable paketini ekleyin:
pubspec.yaml
dependencies:
get_it: ^7.2.0
injectable: ^2.0.0
dev_dependencies:
build_runner: ^2.1.0
injectable_generator: ^2.0.0
Daha sonra terminalde şu komutla paketleri kurun:
bashKodu kopyalaflutter pub get
Injectable Kullanımı
- Injectable Ayarları:
lib
klasörü altında bir injector.dart
dosyası oluşturun ve aşağıdaki kodu ekleyin:
@InjectableInit()
ile Injectable'ın otomatik olarak bağımlılıkları tanımlamasını sağlıyoruz.
- Servislerin Otomatik Kayıt Edilmesi:
AuthService
gibi servislerinizi Injectable ile tanımlamak için, ilgili sınıfların üzerine @lazySingleton
gibi anotasyonlar ekleyin:
- Kod Üretimi:
Servisleri tanımladıktan sonra, kodu üretmek için terminalde şu komutu çalıştırın: flutter pub run build_runner build
Bu komut, injector.config.dart
dosyasını oluşturacak ve servisleri GetIt’e otomatik olarak kaydedecek.
- Kullanım:
Artık manuel olarak bağımlılıkları kaydetmeye gerek yok. Servislerinizi uygulamanın herhangi bir yerinde şu şekilde kullanabilirsiniz:
GetIt ve Injectable İle Bağımlılık Yönetiminin Avantajları
- Kolay Yönetim: Büyük projelerde tüm bağımlılıkları bir noktadan yönetmek, kodun okunabilirliğini ve düzenini artırır.
- Test Edilebilirlik: Bağımlılıkları mock'layarak test etme kolaylığı sağlar. Herhangi bir bağımlılığı, ihtiyaç duyulan yerlerde dinamik olarak değiştirebilirsiniz.
- Modülerlik: Kod parçacıkları arasındaki bağımlılıkları gevşeterek her bir bileşenin bağımsız çalışmasını sağlar, bu da refactor süreçlerinde esneklik sunar.
GetIt ve Injectable İle Test Edilebilirlik
Test aşamasında, bağımlılıkları GetIt’e manuel olarak kayıt edebilir ve mock bağımlılıkları tanımlayabilirsiniz. Örneğin, bir test sınıfında mock bir AuthService kullanmak isterseniz:
Bu şekilde, testlerde gerçek servis yerine mock servis kullanarak uygulamanızın davranışını sınayabilirsiniz.
Sonuç
GetIt ve Injectable, Flutter projelerinde Dependency Injection yönetimini oldukça kolaylaştıran güçlü araçlardır. Projenizin boyutu ne olursa olsun, DI kullanarak kodunuzu daha esnek, modüler ve test edilebilir hale getirebilirsiniz. GetIt sayesinde bağımlılıkları manuel olarak yönetirken, Injectable ile bu süreci otomatik hale getirebilir ve projenizi daha da düzenli hale getirebilirsiniz.
Flutter uygulamanızda DI kullanarak geliştirme süreçlerinizi hızlandırabilir ve uzun vadede bakım ve geliştirme maliyetlerinizi düşürebilirsiniz.
Flutter projelerinde Dependency Injection kullanıyor musunuz?