CodeBlanks Logo Icon CodeBlanks

Meydan okuma 1

StateNotifier ve AsyncValue ile API state yönetimi yaparsın.

Meydan okuma 1 - StateNotifier ve AsyncValue

Bu meydan okumada bir StateNotifier<AsyncValue<List<String>>> oluşturacaksın. AsyncValue.guard ile API çağrısını sarar, loading ve error durumlarını otomatik yönetirsin.

class PostNotifier extends StateNotifier<AsyncValue<List<String>>> {
  PostNotifier() : super(const AsyncValue.loading()) {
    _load();
  }

  Future<void> _load() async {
    state = await AsyncValue.guard(() async => ['a', 'b']);
  }
}

Uygulama PostNotifier tanımla

PostNotifier adında StateNotifier<AsyncValue<List<String>>> tanımla. Constructor AsyncValue.loading() ile başlasın ve _load() çağırsın. _load async metodu state'e AsyncValue.guard(() async => ['post1', 'post2']) sonucunu atasın. main'de PostNotifier örneği al, 100ms bekle, state.value'yu yazdır.

Başlangıç kodu

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

// PostNotifier sınıfını tanımla (StateNotifier ve AsyncValue ile)
// constructor loading durumuyla başlasın ve _load çağırsın
// _load, state'e guard sonucunu atasın

void main() async {
  // PostNotifier örneği al, kısa bekle, state value'yu yazdır
}

Örnek çözüm

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

class PostNotifier extends StateNotifier<AsyncValue<List<String>>> {
  PostNotifier() : super(const AsyncValue.loading()) {
    _load();
  }

  Future<void> _load() async {
    state = await AsyncValue.guard(() async => ['post1', 'post2']);
  }
}

void main() async {
  final notifier = PostNotifier();
  await Future.delayed(const Duration(milliseconds: 100));
  print(notifier.state.value);
  notifier.dispose();
}

Beklenen çıktı

[post1, post2]

Uygulama AsyncValue.when ile durum işle

main içinde state değişkenine AsyncValue.data(['a', 'b']) ata. state.when ile loading, data ve error durumlarını işle: loading () => 'yukleniyor', data (v) => v.join(','), error (e, _) => 'hata: $e'. Sonucu yazdır.

Başlangıç kodu

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

void main() {
  // state değişkenine AsyncValue ile data durumu ata (liste: 'a' ve 'b')
  // .when ile loading, data ve error durumlarını işle
  // loading 'yukleniyor', data ile virgülle birleştir, error 'hata: $e'
  // sonucu yazdır
}

Örnek çözüm

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

void main() {
  final state = AsyncValue.data(['a', 'b']);
  final result = state.when(
    loading: () => 'yukleniyor',
    data: (v) => v.join(','),
    error: (e, _) => 'hata: $e',
  );
  print(result);
}

Beklenen çıktı

a,b

Soru ve cevaplar

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

1 StateNotifier'ın state özelliği ne zaman güncellenmeli?

  • Async işlemler bittiğinde ve değer hazır olduğunda Doğru cevap
  • Asla
  • Her frame
  • Yalnızca constructor içinde

Açıklama: State, constructor'da başlangıç değerini alır; async işlemler bitip değer hazır olduğunda guard sonucuyla güncellenir.

2 AsyncValue.guard çağrısı

Soru
state = await AsyncValue.____(() async => ['a', 'b']);
Cevap
state = await AsyncValue.guard(() async => ['a', 'b']);

Açıklama: AsyncValue.guard, verilen async fonksiyonu sarar; hata olursa AsyncError, başarırsa AsyncData döner.

3 StateNotifier ve AsyncValue eşleşmeleri

Kavram Anlamı
StateNotifier State yöneticisi
AsyncValue Async durum sarmalayıcı
guard Hata yakalar
StateNotifierProvider Provider

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