CodeBlanks Logo Icon CodeBlanks

State sınıfları

State sınıfları ile arayüz durumunu modellemeyi öğrenirsin.

State sınıfları nedir?

State sınıfları, arayüzün o anki durumunu modelleyen değişmez (immutable) nesnelerdir. Her farklı arayüz durumu ayrı bir state sınıfıyla ifade edilir: yükleme, başarı, hata gibi. Bu sayede if (state is LoginSuccess) şeklinde güvenli durum kontrolü yapılır.

abstract class LoginState {}
class LoginLoading extends LoginState {}
class LoginSuccess extends LoginState {
  final String user;
  LoginSuccess(this.user);
}

Soyut state ve alt sınıflar

State'leri bir soyut sınıftan türetmek, ortak davranışları gruplandırır ve durum kontrolünü güvenli hale getirir. Tüm olası state'leri ayrı sınıflar olarak tanımladığında, switch veya if (state is ...) ile her durumu ayrı ayrı işlersin. Bu, bir durumu atlamayı zorlaştırır ve kodu okunur kılar.

abstract class LoginState {}
class LoginInitial extends LoginState {}
class LoginLoading extends LoginState {}
class LoginSuccess extends LoginState {}

Uygulama LoginBloc ve state sınıfları yaz

LoginEvent ve LoginSubmittedEvent tanımla. LoginState soyut sınıfını, LoginLoading ve LoginSuccess (kullanıcı adı tutar) alt sınıflarını yaz. LoginBloc, LoginLoading ile başlasın ve LoginSubmittedEvent işleyicisi LoginSuccess('Ayşe') üretsin. main'de event tetikle, bekle ve başarı durumunda kullanıcı adını yazdır.

Başlangıç kodu

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

// LoginEvent ve LoginSubmittedEvent sınıflarını tanımla

// LoginState soyut sınıfını ve alt sınıflarını tanımla
// LoginLoading ve LoginSuccess (kullanıcı adı tutar)

class LoginBloc extends Bloc<LoginEvent, LoginState> {
  LoginBloc() : super(LoginLoading()) {
    // event işleyici ekle
  }
}

void main() async {
  // oluştur, event ekle, bekle, durumu kontrol et
}

Örnek çözüm

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

abstract class LoginEvent {}
class LoginSubmittedEvent extends LoginEvent {}

abstract class LoginState {}
class LoginLoading extends LoginState {}
class LoginSuccess extends LoginState {
  final String user;
  LoginSuccess(this.user);
}

class LoginBloc extends Bloc<LoginEvent, LoginState> {
  LoginBloc() : super(LoginLoading()) {
    on<LoginSubmittedEvent>((event, emit) =>
      emit(LoginSuccess('Ayşe')));
  }
}

void main() async {
  final bloc = LoginBloc();
  bloc.add(LoginSubmittedEvent());
  await Future.delayed(Duration(milliseconds: 10));
  final state = bloc.state;
  if (state is LoginSuccess) {
    print(state.user);
  }
}

Beklenen çıktı

Ayşe

Soru ve cevaplar

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

1 State sınıfları nasıl tasarlanmalıdır?

  • Değişmez ve her durum için ayrı sınıf Doğru cevap
  • State sınıfı kullanılmaz, Map kullanılır
  • Değiştirilebilir, tek sınıf içinde flag'lerle
  • Her widget için ayrı bir state sınıfı

Açıklama: State'ler değişmez olmalı ve her olası durum ayrı sınıfla modellenmelidir; flag'li tek sınık hata yapmaya açıktır.

2 State sınıfı tanımla

Soru
class LoginSuccess extends ____ {
  final String user;
  LoginSuccess(this.user);
}
Cevap
class LoginSuccess extends LoginState {
  final String user;
  LoginSuccess(this.user);
}

Açıklama: LoginSuccess bir state olduğu için temel state sınıfı LoginState'ten türetilir; Bloc veya Event değil.

3 State parçaları

Kavram Anlamı
abstract class LoginState Temel state sınıfı
class LoginLoading extends Loading durumu
final String user State verisi
if (state is LoginSuccess) Durum kontrolü

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