CodeBlanks Logo Icon CodeBlanks

Meydan okuma 2

Bloc ile login akışı ve hata yönetimi yaparsın.

Meydan okuma 2 - Bloc ile login

Bu meydan okumada bir Bloc ile giriş akışı yapacaksın. LoginEvent gelir, LoginState durumunu loading yapar, sonra success veya failure durumuna geçer.

class LoginBloc extends Bloc<LoginEvent, LoginState> {
  LoginBloc() : super(LoginInitial()) {
    on<LoginSubmitted>((event, emit) async {
      emit(LoginLoading());
      emit(LoginSuccess());
    });
  }
}

Uygulama LoginBloc tanımla

Önce LoginEvent (abstract) ve LoginSubmitted sınıflarını tanımla. Sonra LoginState (abstract) ve LoginInitial, LoginLoading, LoginSuccess sınıflarını tanımla. LoginBloc sınıfını Bloc<LoginEvent, LoginState> olarak tanımla: constructor super(LoginInitial()) çağırsın, on<LoginSubmitted> kaydetsin, handler önce emit(LoginLoading()) sonra emit(LoginSuccess()) yapsın. main'de LoginBloc örneği al ve state.runtimeType'ı yazdır.

Başlangıç kodu

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

// LoginEvent ve LoginSubmitted sınıflarını tanımla
// LoginState ve LoginInitial, LoginLoading, LoginSuccess sınıflarını tanımla
// LoginBloc sınıfını Bloc<LoginEvent, LoginState> olarak tanımla
// constructor başlangıç state'i LoginInitial ile başlasın ve LoginSubmitted event'ini kaydetsin
// handler önce loading sonra success emit yapsın

void main() {
  // LoginBloc örneği al ve state'in runtimeType'ını yazdır
}

Örnek çözüm

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

abstract class LoginEvent {}
class LoginSubmitted extends LoginEvent {}

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

class LoginBloc extends Bloc<LoginEvent, LoginState> {
  LoginBloc() : super(LoginInitial()) {
    on<LoginSubmitted>((event, emit) async {
      emit(LoginLoading());
      emit(LoginSuccess());
    });
  }
}

void main() {
  final bloc = LoginBloc();
  print(bloc.state.runtimeType);
  bloc.close();
}

Beklenen çıktı

LoginInitial

Uygulama LoginSubmitted event'i ekle

Aşağıdaki sınıflar hazır verilir: LoginEvent, LoginSubmitted, LoginState, LoginInitial, LoginLoading, LoginSuccess, LoginBloc. main içinde LoginBloc örneği al, bloc.add(LoginSubmitted()) çağır, 100ms bekle, bloc.state.runtimeType'ı yazdır, sonra bloc.close().

Başlangıç kodu

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

abstract class LoginEvent {}
class LoginSubmitted extends LoginEvent {}

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

class LoginBloc extends Bloc<LoginEvent, LoginState> {
  LoginBloc() : super(LoginInitial()) {
    on<LoginSubmitted>((event, emit) async {
      emit(LoginLoading());
      emit(LoginSuccess());
    });
  }
}

void main() async {
  // LoginBloc örneği al, LoginSubmitted ekle, 100ms bekle, state runtimeType yazdır
}

Örnek çözüm

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

abstract class LoginEvent {}
class LoginSubmitted extends LoginEvent {}

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

class LoginBloc extends Bloc<LoginEvent, LoginState> {
  LoginBloc() : super(LoginInitial()) {
    on<LoginSubmitted>((event, emit) async {
      emit(LoginLoading());
      emit(LoginSuccess());
    });
  }
}

void main() async {
  final bloc = LoginBloc();
  bloc.add(LoginSubmitted());
  await Future.delayed(const Duration(milliseconds: 100));
  print(bloc.state.runtimeType);
  bloc.close();
}

Beklenen çıktı

LoginSuccess

Soru ve cevaplar

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

1 Bloc'ta yeni bir event geldiğinde ne çalışır?

  • createState
  • dispose
  • build metodu
  • on<Event> ile kaydedilen handler Doğru cevap

Açıklama: Bloc, gelen event'i on<Event> ile kaydedilen handler'a yönlendirir; handler emit ile state'i günceller.

2 emit ile success durumuna geç

Soru
emit(____);
Cevap
emit(LoginSuccess);

Açıklama: Handler, işlem başarılı olduğunda emit(LoginSuccess()) ile state'i günceller; LoginEvent ve LoginState sınıf kategorileridir, LoginInitial başlangıç durumudur.

3 Bloc eşleşmeleri

Kavram Anlamı
Bloc Event ve state yöneticisi
event Kullanıcı eylemi
state Ekran durumu
emit State günceller

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