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
Dependency Injection

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.

  1. AuthService Sınıfı:
auth_service.dart
auth_service.dart
  1. 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:

main.dart
main.dart

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.

  1. GetIt ile Servisi Kullanma:

Şimdi uygulamanın herhangi bir yerinde AuthService’i kullanabilirsiniz:

signInUser Function
signInUser Function

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ı

  1. Injectable Ayarları:

lib klasörü altında bir injector.dart dosyası oluşturun ve aşağıdaki kodu ekleyin:

injector.dart
injector.dart

@InjectableInit() ile Injectable'ın otomatik olarak bağımlılıkları tanımlamasını sağlıyoruz.

  1. Servislerin Otomatik Kayıt Edilmesi:

AuthService gibi servislerinizi Injectable ile tanımlamak için, ilgili sınıfların üzerine @lazySingleton gibi anotasyonlar ekleyin:

@lazySingleton
@lazySingleton
  1. 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.

  1. Kullanım:

Artık manuel olarak bağımlılıkları kaydetmeye gerek yok. Servislerinizi uygulamanın herhangi bir yerinde şu şekilde kullanabilirsiniz:

auth_service.dart
auth_service.dart

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:

Auth Service
Auth Service

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?