State sınıfları
- Flutter kursu
- İleri seviye
- Ders 8/69
- 4 dk
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
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
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
class LoginSuccess extends ____ {
final String user;
LoginSuccess(this.user);
}
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ü |