← Back to list

Flutter’da Hafif State Management: get_light ile Tanışın

Flutter ekosisteminde state management denince akla gelen ilk çözümlerden biri şüphesiz GetX. Peki ya GetX’in sadece state management…

Ufuk Sahin · 2026-05-07 05:44 · 0 claps · 4.0 min read
#flutter #getx #flutter-state-management
Open on Medium ↗
Wiki topics: BIZ · Business Strategy 📱 · Mobile Development

Flutter’da Hafif State Management: get_light ile Tanışın

Flutter ekosisteminde state management denince akla gelen ilk çözümlerden biri şüphesiz GetX. Peki ya GetX’in sadece state management, reaktif değişkenler ve dependency injection kısmına ihtiyacınız varsa? İşte tam da bu noktada get_light devreye giriyor.

get_light Nedir?

get_light, GetX paketinin yalnızca temel parçalarını barındıran, sadeleştirilmiş bir Flutter paketidir. Routing, çeviri, validasyon gibi ek özelliklerden arındırılmış; sadece state management, reaktif state, dependency injection ve worker araçlarını içerir.

Pub.dev bağımlılık sayısı sadece 1 (flutter) — yani projenize minimum ek yük getiriyor.

dependencies:
  get_light: ^1.0.2
import 'package:get_light/get_light.dart';

Neden get_light?

GetX harika bir paket, ama bazen ihtiyacınızdan fazlasını sunar. Eğer projenizde:

  • Kendi routing çözümünüzü kullanıyorsanız (GoRouter, Navigator 2.0 vb.)
  • Çeviri için ayrı bir paket tercih ediyorsanız
  • GetX’in sunduğu utility fonksiyonlara ihtiyaç duymuyorsanız

get_light tam size göre. GetX’in en sevilen özelliklerini, tanıdık API ile, sıfır bloat ile sunuyor.

GetX ile Karşılaştırma

| Özellik                           | get_light | GetX |

| State Management                         | ✅ | ✅ |
| Dependency Injection                     | ✅ | ✅ |
| Workers (ever, once, debounce, interval) | ✅ | ✅ |
| Routing                                  | ❌ | ✅ |
| Çeviri / i18n                            | ❌ | ✅ |
| Utils (validator, extensions)            | ❌ | ✅ |
| Pub.dev bağımlılık sayısı                | 1 | birçok |

Reaktif State: .obs ve Obx

get_light’ın en güçlü özelliklerinden biri reaktif state yönetimi. Herhangi bir değişkenin sonuna .obs ekleyerek onu reaktif hale getirebiliyorsunuz.

class CounterController extends GetxController {
  final count = 0.obs;
  final history = RxList<String>();
  void increment() => count.value++;
  void decrement() => count.value--;
  void reset() => count.value = 0;
}

UI tarafında ise Obx widget'ı ile otomatik rebuild:

final ctrl = Get.put(CounterController());
Obx(() => Text('${ctrl.count}'));

Sadece count değiştiğinde Obx içindeki widget yeniden build edilir. Başka hiçbir şeye dokunulmaz.

Desteklenen Reaktif Tipler

| Tip | Oluşturma |
|---|---|
| `Rx<T>` | `value.obs` |
| `RxInt` | `0.obs` |
| `RxDouble` | `0.0.obs` |
| `RxBool` | `false.obs` |
| `RxString` | `''.obs` |
| `RxList<T>` | `RxList<T>()` |
| `RxMap<K,V>` | `RxMap<K,V>()` |
| `RxSet<T>` | `RxSet<T>()` |

---

Simple State: GetBuilder ve update()

Her zaman reaktif state kullanmak zorunda değilsiniz. Daha explicit kontrol istediğinizde GetBuilder ve update() ikilisi imdadınıza yetişiyor.

class CounterController extends GetxController {
  int count = 0;
  void increment() {
    count++;
    update();           // tüm GetBuilder widget'larını rebuild eder
  }
  void incrementCard() {
    count++;
    update(['card']);   // sadece id'si 'card' olan widget'ları rebuild eder
  }
}
GetBuilder<CounterController>(
  init: CounterController(),
  builder: (ctrl) => Text('${ctrl.count}'),
)

Hedefli rebuild (update(['card'])) sayesinde büyük ekranlarda bile performansı maksimumda tutabilirsiniz.

Dependency Injection

GetX’in DI sistemi get_light’da aynen korunmuş durumda. Singleton, lazy, factory — hepsi mevcut.

// Eager singleton — hemen oluşturulur
Get.put(AuthService());
// Lazy singleton — ilk find() çağrısında oluşturulur
Get.lazyPut<ApiService>(() => ApiService());
// Factory — her find() çağrısında yeni instance
Get.create<Repo>(() => Repo());
// Erişim
final auth = Get.find<AuthService>();
final api = Get.findOrNull<ApiService>(); // null-safe
// Kontrol
Get.isRegistered<AuthService>();
Get.isPrepared<ApiService>(); // lazyPut yüklendi mi?
// Temizlik
Get.delete<AuthService>();
Get.deleteAll();

Tag Desteği

Aynı tipte birden fazla instance’a ihtiyacınız varsa tag kullanabilirsiniz:

Get.put(ApiService(baseUrl: 'https://api.example.com'), tag: 'prod');
Get.put(ApiService(baseUrl: 'https://staging.example.com'), tag: 'staging');
final prod = Get.find<ApiService>(tag: 'prod');
final staging = Get.find<ApiService>(tag: 'staging');

Kalıcı Servisler: GetxService

Uygulama boyunca yaşaması gereken servisler için GetxService:

class AuthService extends GetxService {
  final token = ''.obs;
}
void main() {
  WidgetsFlutterBinding.ensureInitialized();
  Get.put(AuthService(), permanent: true);
  runApp(MyApp());
}

GetxService instance'ları deleteAll() çağrılsa bile yok edilmez ( force: true belirtilmediği sürece).

Controller Lifecycle

Her GetxController zengin bir lifecycle sunar:

class MyController extends GetxController {
  @override
  void onInit() {
    super.onInit();
    // Controller oluşturulduğu anda çağrılır
  }
  @override
  void onReady() {
    // onInit'ten bir frame sonra çağrılır
    // BuildContext'e bağlı işlemler için ideal
  }
  @override
  void onClose() {
    // Controller bellekten silindiğinde çağrılır
    super.onClose();
  }
}

onReady, SchedulerBinding.addPostFrameCallback üzerinden çalışır — yani widget ağacı hazır olduğunda tetiklenir. Dialog gösterme, sayfa yönlendirme gibi işlemler için biçilmiş kaftan.

Workers: Değişimleri Dinleyin

Workers, reaktif değişkenleri izleyerek belirli koşullarda callback çalıştırmanıza olanak tanır. Dört farklı worker mevcut:

class SearchController extends GetxController {
  final query = ''.obs;
  final results = RxList<String>();
  Worker? _debouncer;
  @override
  void onInit() {
    super.onInit();
    // Her değişimde çalışır
    ever(query, (val) => print('query: $val'));
    // Koşul ilk kez sağlandığında bir kere çalışır
    once(query, (val) => print('İlk arama: $val'),
        condition: () => query.value.isNotEmpty);
    // En fazla 500ms'de bir çalışır
    interval(query, (val) => _search(val),
        time: const Duration(milliseconds: 500));
    // 500ms sessizlikten sonra çalışır — arama çubuğu için ideal!
    _debouncer = debounce(query, _search,
        time: const Duration(milliseconds: 500));
  }
  void _search(String val) {
    // API çağrısı yap
  }
  @override
  void onClose() {
    _debouncer?.dispose(); // Worker'ları dispose etmeyi unutmayın!
    super.onClose();
  }
}

WorkerDavranışeverHer değişimde çalışıronceKoşul sağlandığında bir kere çalışırintervalİlk değişimden sonra time süresince yeni tetiklemeyi engellerdebouncetime süresince değişim olmazsa son değerle çalışır

Tüyo: Arama çubuğu için debounce, throttling için interval, loglama için ever kullanın.

GetView: Temiz Kod

Controller ile birebir eşleşen ekranlar için GetView<T> harika bir kısayol sunar:

class CounterPage extends GetView<CounterController> {
  const CounterPage({super.key});
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Obx(() => Text('${controller.count}')),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: controller.increment,
        child: const Icon(Icons.add),
      ),
    );
  }
}

controller getter'ı otomatik olarak Get.find<T>() çağrısı yapar. initState/didChangeDependencies içinde Get.find yazmaktan kurtulursunuz.

Gerçek Bir Örnek

Hepsini bir araya getirelim. İşte get_light kullanan küçük bir sayaç uygulaması:

import 'package:flutter/material.dart';
import 'package:get_light/get_light.dart';
// ── Controller ──
class CounterController extends GetxController {
  final count = 0.obs;
  final isDark = false.obs;
  void increment() => count.value++;
  void toggleTheme() => isDark.value = !isDark.value;
}
// ── Service ──
class AppService extends GetxService {
  final sessionId = DateTime.now().millisecondsSinceEpoch;
}
// ── App ──
void main() {
  WidgetsFlutterBinding.ensureInitialized();
  Get.put(AppService(), permanent: true);
  runApp(const MyApp());
}
class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    final ctrl = Get.put(CounterController());
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('get_light Demo')),
        body: Center(
          child: Obx(() => Text(
                '${ctrl.count}',
                style: Theme.of(context).textTheme.displayLarge,
              )),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: ctrl.increment,
          child: const Icon(Icons.add),
        ),
      ),
    );
  }
}

Kimler Kullanmalı?

get_light özellikle şu senaryolarda idealdir:

  • ✅ Minimalistler — Sadece ihtiyacınız olanı isteyenler
  • ✅ Kendi stack’ini kuranlar — Routing ve diğer araçlar için zaten çözümü olanlar
  • ✅ Paket boyutuna dikkat edenler — Düşük bağımlılık sayısı
  • ✅ GetX’ten gelenler — Tanıdık API, sıfır öğrenme eğrisi
  • ✅ Yeni başlayanlar — GetX ekosistemine hafif bir giriş

Sonuç

get_light, GetX’in en değerli parçalarını alıp temiz, odaklı bir paket haline getiriyor. Eğer Flutter projelerinizde basit ama güçlü bir state management çözümü arıyorsanız, get_light’a bir şans verin.

flutter pub add get_light

GitHub: github.com/ufukhawk/get_light Pub.dev: pub.dev/packages/get_light


메타데이터
post_id
1ec0f08d67d0
slug
flutterda-hafif-state-management-get-light-ile-tanışın-1ec0f08d67d0
url
https://medium.com/@ufukzimmerman/flutterda-hafif-state-management-get-light-ile-tan%C4%B1%C5%9F%C4%B1n-1ec0f08d67d0
canonical_url
https://medium.com/@ufukzimmerman/flutterda-hafif-state-management-get-light-ile-tan%C4%B1%C5%9F%C4%B1n-1ec0f08d67d0
author_url
https://medium.com/@ufukzimmerman
status
ok
fetched_at
2026-06-17 08:20:12