CodeBlanks Logo Icon CodeBlanks

Challenge 2

Build a login flow with error handling via Bloc.

Challenge 2 - Login with Bloc

In this challenge you will build a login flow with a Bloc. A LoginEvent arrives, the LoginState becomes loading, then transitions to success or failure.

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

Practice Define LoginBloc

First define LoginEvent (abstract) and LoginSubmitted. Then define LoginState (abstract) and LoginInitial, LoginLoading, LoginSuccess. Define LoginBloc as Bloc<LoginEvent, LoginState>: constructor calls super(LoginInitial()), registers on<LoginSubmitted>, handler first does emit(LoginLoading()) then emit(LoginSuccess()). In main, create a LoginBloc instance and print state.runtimeType.

Starter code

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
}

Sample solution

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();
}

Expected output

LoginInitial

Practice Add the LoginSubmitted event

The following classes are provided: LoginEvent, LoginSubmitted, LoginState, LoginInitial, LoginLoading, LoginSuccess, LoginBloc. In main, create a LoginBloc instance, call bloc.add(LoginSubmitted()), wait 100ms, print bloc.state.runtimeType, then call bloc.close().

Starter code

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
}

Sample solution

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();
}

Expected output

LoginSuccess

Questions and answers

Review the lesson questions together with their answers. To test yourself, solve the lesson interactively.

1 What runs when a new event arrives in a Bloc?

  • createState
  • dispose
  • build method
  • The handler registered with on<Event> Correct answer

Explanation: The Bloc routes the incoming event to the handler registered with on<Event>; the handler updates state via emit.

2 Transition to success state with emit

Question
emit(____);
Answer
emit(LoginSuccess);

Explanation: When the operation succeeds, the handler updates state with emit(LoginSuccess()); LoginEvent and LoginState are class categories, LoginInitial is the initial state.

3 Bloc matches

Term Meaning
Bloc Event and state manager
event User action
state Screen state
emit Updates state

All lessons in Advanced