Flutter
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.
Örnek çözümü göster
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);
}
}
Kendini test et
-
State sınıfları nasıl tasarlanmalıdır?
- Değişmez ve her durum için ayrı sınıf
- 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ı
Cevabı göster
Değişmez ve her durum için ayrı sınıf — 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.
-
State sınıfı tanımla
class LoginSuccess extends ____ {
final String user;
LoginSuccess(this.user);
}
Cevabı göster
class LoginSuccess extends LoginState {
final String user;
LoginSuccess(this.user);
}
-
State parçaları
- abstract class LoginState
- Temel state sınıfı
- class LoginLoading extends
- Loading durumu
- final String user
- State verisi
- if (state is LoginSuccess)
- Durum kontrolü
Sıradaki ders: BlocListener