CodeBlanks Logo Icon CodeBlanks

StateNotifierProvider

StateNotifierProvider ile ağaca sağlamayı öğrenirsin.

StateNotifierProvider nedir?

StateNotifierProvider, bir StateNotifier'ı widget ağacına sağlayan Riverpod provider'ıdır. ref.watch(provider) ile state'e erişir, ref.read(provider.notifier) ile StateNotifier'ın kendisini alıp metotlarını çağırırsın. İkinci generic parametre state'in türünü belirtir.

final counterProvider = StateNotifierProvider<CounterNotifier, int>(
  (ref) => CounterNotifier(),
);

watch ve read farkı

ref.watch state değişince widget'ı yeniden inşa eder; ref.read ise anlık okuma yapar ve yeniden inşa tetiklemez. Bu yüzden butonların onPressed'ında read kullanılır. Yanlışlıkla watch kullanırsan her tıklamada yeniden inşa tetiklenebilir.

Widget build(BuildContext context, WidgetRef ref) {
  final count = ref.watch(counterProvider);
  return ElevatedButton(
    onPressed: () => ref.read(counterProvider.notifier).increment(),
    child: Text('$count'),
  );
}

Uygulama StateNotifierProvider kullan

counterProvider adında bir StateNotifierProvider tanımla; CounterNotifier tipinde, int state tutsun. main içinde ProviderContainer oluştur, iki kez increment çağır ve state'i yazdır.

Başlangıç kodu

main.dart
import 'package:flutter_riverpod/flutter_riverpod.dart';

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

// counterProvider'ı tanımla
// CounterNotifier tipinde, int state tutsun

void main() {
  // ProviderContainer ile iki kez artır, yazdır
}

Örnek çözüm

main.dart
import 'package:flutter_riverpod/flutter_riverpod.dart';

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

final counterProvider = StateNotifierProvider<CounterNotifier, int>(
  (ref) => CounterNotifier(),
);

void main() {
  final container = ProviderContainer();
  container.read(counterProvider.notifier).increment();
  container.read(counterProvider.notifier).increment();
  print(container.read(counterProvider));
}

Beklenen çıktı

2

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 StateNotifierProvider ile state'i güncellemek için hangisi kullanılır?

  • ref.read(provider).metot()
  • ref.notify(provider).metot()
  • ref.read(provider.notifier).metot() Doğru cevap
  • ref.watch(provider).metot()

Açıklama: state'i değiştiren metotlar StateNotifier'ın kendisindeidir; bu yüzden provider.notifier üzerinden read ile alınır.

2 StateNotifierProvider tanımla

Soru
final counterProvider = StateNotifierProvider<CounterNotifier, int>(
  (ref) => ____,
);
Cevap
final counterProvider = StateNotifierProvider<CounterNotifier, int>(
  (ref) => CounterNotifier(),
);

Açıklama: Oluşturucu fonksiyon, StateNotifier örneğini döndürür; parantezlerle çağrı gerekir.

3 StateNotifierProvider parçaları

Kavram Anlamı
StateNotifierProvider StateNotifier sağlar
ref.watch(provider) state'i dinler
ref.read(provider.notifier) StateNotifier'ı verir
(ref) => CounterNotifier() Oluşturucu fonksiyon

İleri seviye bölümündeki tüm dersler