Bloc (State Management) Form Validation using Bloc

 abstract class SignInState {}


class SignInInitialState extends SignInState {}

class SignInValidState extends SignInState {}

class SignInErrorState extends SignInState {
final String errorMessage;
SignInErrorState(this.errorMessage);
}

class SignInLoadingState extends SignInState {}

abstract class SignInEvent {}

class SignInTextChangedEvent extends SignInEvent {
final String emailValue;
final String passwordValue;
SignInTextChangedEvent(this.emailValue, this.passwordValue);
}

class SignInSubmittedEvent extends SignInEvent {
final String email;
final String password;
SignInSubmittedEvent(this.email, this.password);
}

import "package:email_validator/email_validator.dart";
import "package:firebase/Stateless_Component_UI/Bloc%20Sign%20In/sign_in/Bloc/sign_in_event.dart";
import "package:firebase/Stateless_Component_UI/Bloc%20Sign%20In/sign_in/Bloc/sign_in_state.dart";
import "package:flutter_bloc/flutter_bloc.dart";

class SignInBloc extends Bloc<SignInEvent, SignInState>
{
SignInBloc() : super(SignInInitialState()) {
on<SignInTextChangedEvent>((event, emit) {
if(EmailValidator.validate(event.emailValue) == false)
{
emit(SignInErrorState("Please Enter a valid email address"));
}
else if(event.passwordValue.length < 8)
{
emit(SignInErrorState("Please Enter a valid password"));
}
else
{
emit(SignInValidState());
}
},);

on<SignInSubmittedEvent>((event, emit) {
emit(SignInLoadingState());
},);
}
}

import "package:firebase/Stateless_Component_UI/Bloc%20Sign%20In/sign_in/Bloc/sign_in_bloc.dart";
import "package:firebase/Stateless_Component_UI/Bloc%20Sign%20In/sign_in/Bloc/sign_in_event.dart";
import "package:firebase/Stateless_Component_UI/Bloc%20Sign%20In/sign_in/Bloc/sign_in_state.dart";
import "package:flutter/material.dart";
import "package:flutter_bloc/flutter_bloc.dart";

class SignInScreen extends StatelessWidget {
SignInScreen({super.key});

TextEditingController emailController = TextEditingController();
TextEditingController passwordController = TextEditingController();

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Form Validation"),
centerTitle: true,
backgroundColor: Colors.grey,
),
body: Center(
child: Container(
width: 300.0,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
BlocBuilder<SignInBloc, SignInState>(
builder: (context, state) {
if (state is SignInErrorState) {
return Text(state.errorMessage,
style: const TextStyle(color: Colors.red),);
}
else {
return Container();
}
},
),
const SizedBox(height: 20.0),
TextFormField(
controller: emailController,
onChanged: (value) {
BlocProvider.of<SignInBloc>(context).add(
SignInTextChangedEvent(emailController.text, passwordController.text),
);
},
decoration: const InputDecoration(
hintText: "Email Address",
),
),
const SizedBox(height: 20.0),
TextFormField(
controller: passwordController,
onChanged: (value) {
BlocProvider.of<SignInBloc>(context).add(
SignInTextChangedEvent(emailController.text, passwordController.text),
);
},
decoration: const InputDecoration(
hintText: "Password",
),
),
const SizedBox(height: 40.0),
BlocBuilder<SignInBloc, SignInState>(
builder: (context, state) {

if(state is SignInLoadingState)
{
return const CircularProgressIndicator();
}

return ElevatedButton(
onPressed: () {
if(state is SignInValidState)
{
BlocProvider.of<SignInBloc>(context).add(
SignInSubmittedEvent(emailController.text, passwordController.text),
);
}
},
style: ElevatedButton.styleFrom(
fixedSize: const Size(350.0, 50.0),
backgroundColor: (state is SignInValidState) ? Colors.blue : Colors.grey,
),
child: const Text("Sign In",
style: TextStyle(fontWeight: FontWeight.bold,
color: Colors.white,
fontSize: 20.0),
),
);
},
),
],
),
),
),
);
}
}


import "package:firebase/Stateless_Component_UI/Bloc%20Sign%20In/sign_in/Bloc/sign_in_bloc.dart";
import "package:firebase/Stateless_Component_UI/Bloc%20Sign%20In/sign_in/sign_in_screen.dart";
import "package:flutter/material.dart";
import "package:flutter_bloc/flutter_bloc.dart";

void main() {
runApp(const MyApp());
}

class MyApp extends StatelessWidget {
const MyApp({super.key});

@override
Widget build(BuildContext context) {
return MaterialApp(
title: "Welcome Screen",
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.grey,
),
home: const WelcomeScreen(),
);
}
}

class WelcomeScreen extends StatelessWidget {
const WelcomeScreen({super.key});

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Welcome Screen"),
centerTitle: true,
backgroundColor: Colors.grey,
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text("Welcome",
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 30.0, color: Colors.blue),),
const SizedBox(height: 50.0),
ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return BlocProvider(
create: (context) => SignInBloc(),
child: SignInScreen(),
);
},
),
);
},
style: ElevatedButton.styleFrom(
fixedSize: const Size(350.0,50.0),
backgroundColor: Colors.blue,
),
child: const Text("Sign In with Email",
style: TextStyle(color: Colors.white, fontSize: 20.0),),
),
const SizedBox(height: 20.0),
ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
fixedSize: const Size(350.0,50.0),
backgroundColor: Colors.blue,
),
child: const Text("Sign In with Google",
style: TextStyle(color: Colors.white, fontSize: 20.0),),
),
],
),
),
);
}
}

Comments

Popular posts from this blog

Second GET API Calling with Bloc simple Example in Flutter

Stack Container Scrollable Card widget UI with Custom Widget

Pagination with Bloc Pattern in Flutter