05.R / CodeBros Digital SignalSinyal aktif

Mobil Uygulama

Flutter'da State Management

Flutter uygulamalarında durum yönetimi için farklı yaklaşımların karşılaştırılması.

Yayın
15 Mayıs 2025
Yazar
CodeBros Editör Ekibi
Okuma
3 dakikada okunur
Kategori
Mobil Uygulama
Flutter'da State Management blog yazısı öne çıkan görseli
CodeBros intelligence3 dakikada okunur

Flutter uygulamaları geliştirirken karşılaştığımız en önemli konulardan biri state management (durum yönetimi) dir. Bu yazıda, Flutter'da kullanabileceğimiz farklı state management yaklaşımlarını inceleyeceğiz.

Performanslı Kod: Karmaşık uygulama mimarilerinde uzmanlaşmış ekibimizden destek alarak Mobil Projenizi hatasız ve ölçeklenebilir şekilde geliştirelim.

State Management Nedir?

State management, uygulamanızdaki verilerin nasıl saklandığını, güncelleneceğini ve widget'lar arasında nasıl paylaşılacağını belirleyen yapıdır.

1. setState() - Temel Yaklaşım

En basit state management yaklaşımı setState() metodunu kullanmaktır:

class CounterWidget extends StatefulWidget {
  @override
  _CounterWidgetState createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text('Counter: $_counter'),
        ElevatedButton(
          onPressed: _incrementCounter,
          child: Text('Increment'),
        ),
      ],
    );
  }
}

Avantajları:

  • Basit ve anlaşılır
  • Küçük projeler için ideal
  • Ekstra paket gerektirmez

Dezavantajları:

  • Büyük projelerde karmaşıklaşır
  • Widget'lar arası veri paylaşımı zor
  • Kod tekrarı oluşabilir

2. Provider Pattern

Provider, Flutter team tarafından önerilen state management çözümüdür:

// Model sınıfı
class CounterModel extends ChangeNotifier {
  int _counter = 0;
  
  int get counter => _counter;
  
  void increment() {
    _counter++;
    notifyListeners();
  }
}

// Provider ile sarmalama
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (context) => CounterModel(),
      child: MaterialApp(
        home: CounterScreen(),
      ),
    );
  }
}

// Consumer ile veri okuma
class CounterScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Consumer<CounterModel>(
          builder: (context, counter, child) {
            return Text('Count: ${counter.counter}');
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => context.read<CounterModel>().increment(),
        child: Icon(Icons.add),
      ),
    );
  }
}

Avantajları:

  • Flutter team tarafından desteklenir
  • Kolay öğrenme eğrisi
  • Performanslı
  • Widget tree'de herhangi bir yerden erişim

Dezavantajları:

  • Çok karmaşık uygulamalar için yetersiz kalabilir
  • Boilerplate code artışı

3. BLoC Pattern

Business Logic Component pattern, reactive programming yaklaşımını kullanır:

// Events
abstract class CounterEvent {}

class CounterIncremented extends CounterEvent {}

// States
abstract class CounterState {}

class CounterInitial extends CounterState {}

class CounterValue extends CounterState {
  final int value;
  CounterValue(this.value);
}

// BLoC
class CounterBloc extends Bloc<CounterEvent, CounterState> {
  CounterBloc() : super(CounterInitial()) {
    on<CounterIncremented>((event, emit) {
      if (state is CounterValue) {
        emit(CounterValue((state as CounterValue).value + 1));
      } else {
        emit(CounterValue(1));
      }
    });
  }
}

Avantajları:

  • Çok güçlü ve esnek
  • Test edilebilir
  • Büyük projeler için ideal
  • Reactive programming desteği

Dezavantajları:

  • Öğrenme eğrisi yüksek
  • Basit işlemler için fazla karmaşık
  • Boilerplate code fazla

4. Riverpod

Provider'ın geliştirilmiş versiyonu:

// Provider tanımlama
final counterProvider = StateNotifierProvider<CounterNotifier, int>((ref) {
  return CounterNotifier();
});

class CounterNotifier extends StateNotifier<int> {
  CounterNotifier() : super(0);
  
  void increment() => state++;
}

// Kullanım
class CounterScreen extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final counter = ref.watch(counterProvider);
    
    return Scaffold(
      body: Center(
        child: Text('Count: $counter'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => ref.read(counterProvider.notifier).increment(),
        child: Icon(Icons.add),
      ),
    );
  }
}

Avantajları:

  • Compile-time safety
  • Daha iyi performans
  • Daha az boilerplate
  • Auto-dispose

Hangi Yaklaşımı Seçmeli?

Küçük Projeler:

  • setState() - Basit local state için
  • Provider - Widget'lar arası veri paylaşımı için

Orta Büyüklükte Projeler:

  • Provider - Genel tercih
  • Riverpod - Daha modern yaklaşım

Büyük Projeler:

  • BLoC - Karmaşık business logic
  • Riverpod - Modern ve güçlü

Sonuç

Flutter'da state management seçimi projenizin büyüklüğüne, karmaşıklığına ve team'inizin deneyimine bağlıdır. Başlangıç için Provider veya Riverpod'u öneririm, çünkü öğrenme eğrisi düşük ve çoğu proje için yeterlidir.

Hangi yaklaşımı seçerseniz seçin, consistency (tutarlılık) ve clean code principles'larına odaklanmayı unutmayın.

Kaynaklar


Bu yazı Flutter state management konusunda temel bilgiler sunmaktadır. Daha detaylı bilgi için resmi dokümantasyonları inceleyebilirsiniz.

Evidence layer

Kaynaklar ve yöntem

From insight to action

Bilgiyi markanız için çalışan sisteme dönüştürelim.

Sivas'taki yerel markalara ve Türkiye genelindeki işletmelere sosyal medya, dijital pazarlama, web tasarım, SEO ve yazılım çözümleri sunuyoruz.

Ön görüşme talep edin
WhatsApp