First API Calling with Cubit in Flutter

 import "dart:convert";


import "package:api_with_cubit/2nd_API_call_using_Cubit/Model/login_model.dart";
import "package:http/http.dart" as http;

class ApiServicesSecond {
String baseUrl = "https://reqres.in/";

Future<LoginModel?> userLogIn(String email, String password) async {
var response = await http.post(
Uri.parse("${baseUrl}api/login"),
body: {
"email": email,
"password": password,
},
);

if (response.statusCode == 200) {
LoginModel logInModel = LoginModel.fromJson(jsonDecode(response.body));
return logInModel;
}
return null;
}
}
import "package:api_with_cubit/2nd_API_call_using_Cubit/API_services/api_services.dart";
import "package:api_with_cubit/2nd_API_call_using_Cubit/Cubits/user_login_cubit.dart";
import "package:api_with_cubit/2nd_API_call_using_Cubit/Cubits/user_login_state.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: "Login Screen",
debugShowCheckedModeBanner: false,
theme: ThemeData(
appBarTheme: const AppBarTheme(
backgroundColor: Colors.grey,
centerTitle: true,
),
),
home: LoginScreen(),
);
}
}

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

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

@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
return FocusManager.instance.primaryFocus?.unfocus();
},
child: Scaffold(
appBar: AppBar(
title: const Text(
"Login screen",
style: TextStyle(fontWeight: FontWeight.bold),
),
centerTitle: true,
),
body: Center(
child: SizedBox(
width: 300.0,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextFormField(
controller: emailController,
decoration: InputDecoration(
hintText: "Enter Email",
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(11.0),
),
),
),
const SizedBox(height: 30.0),
TextFormField(
controller: passwordController,
decoration: InputDecoration(
hintText: "Enter Password",
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(11.0),
),
),
),
const SizedBox(height: 40.0),
BlocProvider(
create: (context) => UserLoginCubit(),
child: BlocConsumer<UserLoginCubit, UserLoginState>(
listener: (context, state) {
print(state);
},
builder: (context, state) {
if (state is UserLoginLoaded) {
print(state.loginModel.token);
}
return ElevatedButton(
onPressed: () {
WidgetsBinding.instance
.addPostFrameCallback((timeStamp) {
context.read<UserLoginCubit>().userLogin(
emailController.text.toString(),
passwordController.text.toString());
});
},
style: ElevatedButton.styleFrom(
backgroundColor: Colors.blue,
fixedSize: const Size(200.0, 50.0),
shape: const LinearBorder(),
),
child: state is UserLoginLoading
? const CircularProgressIndicator(
color: Colors.white,
)
: const Text(
"Continue",
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 20.0,
color: Colors.white),
),
);
},
),
),
],
),
),
),
),
);
}
}

import 'package:api_with_cubit/2nd_API_call_using_Cubit/API_services/api_services.dart';
import 'package:api_with_cubit/2nd_API_call_using_Cubit/Cubits/user_login_state.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

class UserLoginCubit extends Cubit<UserLoginState> {
UserLoginCubit() : super(UserLoginInitial());

userLogin(String email, String password) {
emit(UserLoginLoading());
ApiServicesSecond().userLogIn(email, password).then((value) {
emit(UserLoginLoaded(loginModel: value!));
print("UserToken: ${value.token}");
}).onError((error, stackTrance) {
print(error.toString());
emit(UserLoginError(errormsg: error.toString()));
});
}
}

import 'package:api_with_cubit/2nd_API_call_using_Cubit/Model/login_model.dart';

abstract class UserLoginState {}

class UserLoginInitial extends UserLoginState {}

class UserLoginLoading extends UserLoginState {}

class UserLoginLoaded extends UserLoginState {
final LoginModel loginModel;

UserLoginLoaded({required this.loginModel});
}

class UserLoginError extends UserLoginState {
String errormsg;

UserLoginError({required this.errormsg});
}


class LoginModel {
String? token;

LoginModel({this.token});

LoginModel.fromJson(Map<String, dynamic> json) {
token = json['token'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['token'] = this.token;
return data;
}
}




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