GetX: temel kavramlar, Flutter'da navigasyon ve DI

Yazar: IT Sectr Yayınlanma: 2026-02-19 Okuma süresi: 7 dk

GetX — durum yönetimi, navigasyon ve bağımlılık enjeksiyonunu tek bir pakette birleştiren Flutter için hafif bir mikro çerçevedir. Amir Hossein Abdorashidi tarafından geliştirilen GetX, minimum boilerplate sunar: Stream yok, ChangeNotifier yok, navigasyon için BuildContext gerekmez. pub.dev'e göre GetX, 13 binden fazla beğeni alarak en popüler Flutter paketlerinden biri haline gelmiştir.

Önemli Noktalar

  • Obx — Rx değişkeni değiştiğinde yeniden oluşturulan reaktif widget
  • GetController — metotlar ve Rx değişkenleri ile iş mantığı sınıfı
  • Get.to — adlandırılmış rotalar üzerinden BuildContext olmadan navigasyon
  • Get.put / Get.find — DI konteynerı aracılığıyla bağımlılık enjeksiyonu ve alımı
  • Rx değişkenleri — otomatik bildirim ile reaktif sarmalayıcılar (RxInt, RxString, RxBool)

GetX nedir?

GetX — Flutter için hepsi-bir-arada bir mikro çerçevedir ve üç ana geliştirme görevini çözer: durum yönetimi, navigasyon (yönlendirme) ve bağımlılık enjeksiyonu (DI). GetX, Stream, ChangeNotifier, Builders veya abonelik gerektirmez — tüm reaktivite, GetValue ve GetStream tabanlı Rx sarmalayıcılar tarafından sağlanır ve ChangeNotifier'dan onlarca kat daha hızlı çalışır.

GetX, Provider + Navigator + get_it/kiwi kombinasyonuna bir alternatif olarak konumlandırılmıştır. Üç farklı paket kurup 10 satır yapılandırma yazmak yerine, GetX tek bir satırla her şeyi hazır sunar: GetMaterialApp yerine MaterialApp. Navigasyon, Get.to(NextScreen()) ile BuildContext olmadan, DI ise Get.put(Service()) ile Provider ağacı olmadan çalışır.

Flutter Community Survey 2025'e göre GetX, Flutter projelerinin %43'ünde kullanılmaktadır. Seçilme nedenleri: minimum giriş eşiği (öğrenmesi 5 dakika), boilerplate yok (Provider veya BLoC'a kıyasla kod %60-70 azalır) ve hızlı MVP geliştirme. Eleştirmenler, sorumlulukların ayrılması ilkesinin ihlalini ve hata ayıklama karmaşıklığını belirtmektedir.

Reaktif durum: Obx ve Rx

Obx — Rx değişkenleri değiştiğinde yeniden oluşturulan reaktif bir GetX widget'ıdır. Obx, abonelik, dispose veya Builder işlevleri gerektirmez — widget'ı Obx ile sarın ve içinde bir Rx değişkeni kullanın. Obx, hangi Rx değişkenlerinin kullanıldığını otomatik olarak izler ve yalnızca bunlar değiştiğinde yeniden çizer.

Dart
class CounterController extends GetxController {
  final count = 0.obs;
  void increment() => count++;
}

class CounterScreen extends StatelessWidget {
  final controller = Get.put(CounterController());

  @override
  Widget build(context) => Obx(() => Text('${controller.count}'));
}

Rx değişkenleri: .obs — herhangi bir değeri Rx nesnesine sarmalayan bir getter. GetX, tür belirtilmiş Rx sınıfları sağlar: RxInt, RxString, RxDouble, RxBool, RxList, RxMap. Tüm Rx değişkenleri normal ilkeller gibi davranır: count++, name.value = 'Hello', items.add(item). Değişiklik, Obx abonelerini otomatik olarak bilgilendirir.

GetBuilder — Rx olmadan Obx'e bir alternatiftir ve manuel update() çağrılarıyla çalışır. GetBuilder.filter — ID anahtarlarıyla hedefli güncellemeler için. Obx daha hızlıdır (otomatik bağımlılık takibi), GetBuilder daha öngörülebilirdir (açık güncelleme çağrısı). Basit senaryolar için Obx, çok sayıda bağımlılığı olan karmaşık widget'lar için GetBuilder önerilir.

GetController ve yaşam döngüsü

GetxController — yaşam döngüsü desteği ile iş mantığı için temel bir sınıftır. GetxController'ın metotları: onInit() (başlatma), onReady() (ilk kareden sonra), onClose() (kaynak temizliği). ChangeNotifier ve StateNotifier'ın aksine GetxController, abonelikleri otomatik olarak yönetir: sayfa yok edildiğinde, tüm Rx değişkenleri ve Workers'ın aboneliği iptal edilir.

Dart
class AuthController extends GetxController {
  final user = Rx<User?>(null);
  final isLoading = false.obs;

  @override
  void onInit() {
    ever(isLoading, (_) => print('Loading: $isLoading'));
    super.onInit();
  }

  Future<void> login(String email, String password) async {
    isLoading.value = true;
    user.value = await api.login(email, password);
    isLoading.value = false;
  }
}

Workers — reaktif GetX yardımcı programları: ever (her değişiklikte çağrılır), once (yalnızca ilk değişiklikte), debounce (gecikmeli), interval (saniyede N defadan fazla değil). Workers, tipik görevleri çözer: alan doğrulama (debounce), analitik (once), senkronizasyon (ever). Workers, onClose() çağrıldığında otomatik olarak abonelikten çıkar ve bellek sızıntılarını önler.

GetX navigasyonu ekranlar arasında geçiş için BuildContext gerektirmez. Navigator.push(context, MaterialPageRoute(...)) yerine Get.to(NextScreen()) kullanılır — BuildContext erişimi olmayan bir Controller dahil olmak üzere her yerden çağrılabilir. GetX, adlandırılmış rotaları, animasyonları, middleware'i ve MaterialPageRoute olmadan argüman iletmeyi destekler.

Dart
// Normal navigasyon
Get.to(ProfileScreen());
Get.back();
Get.off(LoginScreen()); // mevcut rotayı değiştir
Get.offAll(HomeScreen()); // yığını temizle

// Adlandırılmış rotalar
Get.toNamed('/profile', arguments: 'user123');
Get.offNamed('/login');

// Middleware
GetPage(
  name: '/profile',
  page: () => ProfileScreen(),
  middlewares: [AuthMiddleware()],
)

GetPage ve GetPages: GetX, MaterialApp'teki routes yerine GetPages kullanır. Middleware — bir ekrana girmeden önce kimlik doğrulama kontrolleri, yönlendirmeler, analitik. Transition — yerleşik geçiş animasyonları: fadeIn, zoom, leftToRight, topToBottom. Bindings — bir rotaya girildiğinde Controller ve bağımlılıkları başlatan sınıf. Bindings, tembel başlatma sorununu çözer: Controller yalnızca ekran açıldığında oluşturulur.

GetX ile bağımlılık enjeksiyonu

Get.put — DI konteynerına bir örnek kaydeder. Get.find — konteynerdan bir örnek alır. Get.lazyPut — tembel başlatma (ilk find çağrısında oluşturulur). Get.putAsync — asenkron başlatma (init ile hizmetler için). Get.delete — konteynerdan kaldırır (rota yok edildiğinde Bindings tarafından otomatik olarak çağrılır).

MetotNe zaman oluşturulurNe zaman kaldırılır
Get.putHemenGet.delete veya onClose
Get.lazyPutİlk find'daGet.delete veya onClose
Get.putAsyncFuture tamamlandıktan sonraGet.delete veya onClose
Get.createHer find'da (yeni fabrika)Hayır

GetX DI — Flutter'daki en basit DI konteynerı. Provider ağacı yok, Module yok, Scope yok. Controller veya main.dart'te Get.put(Repository()) yapmak, nesneyi Get.find<Repository>() aracılığıyla uygulamanın her yerinde erişilebilir kılar. GetX DI ayrıca etiketleme (tag: 'api') ve kalıcılık (permanent: true) özelliklerini destekleyerek silinmeyi önler.

GetX: en iyi uygulamalar ve performans

GetX performansı, Flutter için optimize edilmiş özel bir Stream uygulaması olan GetStream aracılığıyla çalışan Rx sarmalayıcılarına dayanır. GetX karşılaştırmalarına göre, Rx değişkenleri sık güncellemelerde (30+ fps) ChangeNotifier'dan 2-3 kat ve BLoC'dan 5-7 kat daha hızlıdır. GetX, abonelikler için BuildContext kullanmaz, bu da navigasyon sırasında widget ağacının yeniden oluşturulmasını ortadan kaldırır.

En iyi uygulamalar: çok sayıda alt öğeye sahip widget'lar (listeler, tablolar) için Obx yerine GetBuilder kullanın. Sayfa başına devasa bir Controller yerine Controller'ı işlevsel modüllere bölün. Controller başlatma için build metodunda Get.put yerine Bindings kullanın. GetView — Get.find olmadan controller aracılığıyla Controller erişimi olan kısaltılmış bir StatelessWidget.

Bilinen sınırlamalar: GetX, test etmeyi zorlaştırabilecek genel değişkenler (Get.find, Get.to) kullanır. GetX aracılığıyla bağımlılıkları mock'lamak, testler arasında Get.replace() veya Get.reset() gerektirir. İzolasyon için Get.testMode = true önerilir. GetX, net katman sınırları olan katı bir mimari gerektiren uygulamalar için önerilmez — bu durumda, kod oluşturma ile BLoC veya Riverpod tercih edilir.

Sıkça Sorulan Sorular

GetX, Provider'dan nasıl farklıdır?

GetX — kendi DI, navigasyon ve Rx reaktivitesine sahip bir mikro çerçevedir. Provider — yalnızca ChangeNotifier ve InheritedWidget aracılığıyla durum yönetimidir. GetX, BuildContext gerektirmez, yerleşik navigasyon ve DI'ya sahiptir, boilerplate'i %60-70 azaltır. Provider, standart Flutter Navigator'ı kullanır ve DI için üçüncü taraf çözümler gerektirir. GetX geliştirmede daha hızlıdır, Provider yerel Flutter API'sine daha yakındır.

GetX Workers nedir?

Workers — Rx değişkenlerindeki değişikliklerin reaktif işlenmesi için yardımcı programlardır. ever — her değişiklikte geri çağrı, once — yalnızca ilk değişiklikte, debounce — gecikmeli (arama alanları için), interval — N defadan fazla değil (analitik için). Workers, GetxController'ın onInit()'inde bildirilir ve onClose()'ta otomatik olarak abonelikten çıkar. Bu, ChangeNotifier ile manuel addListener/removeListener'ın yerini alır.

GetX nasıl test edilir?

GetX, test modunu etkinleştirmek için Get.testMode = true sağlar. Bağımlılıklar Get.replace<Service>(mockService) aracılığıyla değiştirilir. Testler arasında, DI konteynerını temizlemek için Get.reset() çağrılır. Controller'lar Flutter olmadan doğrudan test edilir: final c = CounterController(); c.increment(); expect(c.count.value, 1). Obx içeren widget'lar için InjectMocker ile tester.pumpWidget kullanın.

Büyük projeler için GetX kullanmalı mıyım?

GetX her boyuttaki proje için uygundur ancak disiplin gerektirir. Büyük projeler (10+ ekran) için şunları kullanın: Controller izolasyonu için Bindings, özellik başına GetPages dosyaları olarak modüller, build'te manuel Get.find yerine GetView. Ana risk, genel erişimin kötüye kullanılmasıdır (her yerde Get.find). Sıkı kod incelemeleri ve mimari kılavuzlar bunu çözer. Milyonlarca kullanıcıya sahip birçok üretim uygulaması GetX üzerinde çalışmaktadır.

GetX Bindings nedir?

Bindings — bir rotayı bağımlılıklarına bağlayan bir sınıftır. Bir ekrana girildiğinde, Binding Get.lazyPut aracılığıyla Controller ve hizmetleri oluşturur ve çıkışta bunları kaldırır. Bindings, tembel başlatmayı uygular: ekran açılana kadar Controller bellekte bulunmaz. Bu, RAM ve uygulama başlatma süresinden tasarruf sağlar. GetPage'de bildirilir: GetPage(name: '/profile', page: () => ProfileScreen(), binding: ProfileBinding()).

Özet

  • GetX — tek pakette durum yönetimi, navigasyon ve DI ile Flutter mikro çerçevesi
  • Obx ve Rx — Stream ve ChangeNotifier olmadan otomatik yeniden çizim ile reaktif sarmalayıcılar
  • GetxController — onInit/onReady/onClose yaşam döngüsü ile iş mantığı sınıfı
  • Get.to / Get.back — yerleşik animasyonlarla BuildContext olmadan navigasyon
  • Get.put / Get.find — tembel başlatma ile Provider ağacı olmadan DI konteynerı
  • Workers — değişikliklerin reaktif işlenmesi için ever, once, debounce, interval
  • Bindings — otomatik yok etme ile rota açılışında tembel Controller başlatma

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun