Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 14 additions & 10 deletions basic_flutter/lib/business_logic/cubits/response_cubit.dart
Original file line number Diff line number Diff line change
@@ -1,28 +1,32 @@
import 'package:basic_flutter/presentation/screens/employees_list_screen.dart';
import 'package:bloc/bloc.dart';

import '../../presentation/screens/employees_list_screen.dart';
import '/../repository/data_provider.dart';
import '/business_logic/cubits/response_state.dart';
import '../../data/employee.dart';

class ResponseCubit extends Cubit<ResponseState> {
late List<Employee> employeeList;
final DataProvider dataProvider;
late int currentListIndex;
ResponseCubit(this.dataProvider, this.employeeList)
: super(ResponseState(DataLoadingStates.dataLoading, employeeList)) {

ResponseCubit(this.dataProvider)
: super(ResponseState(DataLoadingStates.dataLoading, dataProvider)) {
getStateData();
}

void getStateData() async {
Future<void> getStateData() async {
try {
final employeeList =
await dataProvider.getEmployeesList(EmployeesListScreen.url);
if (employeeList.isNotEmpty) {
emit(ResponseState(DataLoadingStates.dataLoaded, dataProvider));
employeeList = await dataProvider
.getEmployeesList(EmployeesListScreen.searchEmployeeListEndpoint);
currentListIndex = employeeList.length;
if (currentListIndex != 0) {
emit(ResponseState(DataLoadingStates.dataLoaded, employeeList));
} else {
emit(ResponseState(DataLoadingStates.loadingFailed, dataProvider));
emit(ResponseState(DataLoadingStates.loadingFailed, employeeList));
}
} catch (error) {
emit(ResponseState(DataLoadingStates.loadingFailed, dataProvider));
emit(ResponseState(DataLoadingStates.loadingFailed, employeeList));
}
}
}
6 changes: 3 additions & 3 deletions basic_flutter/lib/business_logic/cubits/response_state.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import '/repository/data_provider.dart';
import '../../data/employee.dart';

enum DataLoadingStates { dataLoading, dataLoaded, loadingFailed }

class ResponseState {
DataLoadingStates dataState;
DataProvider dataProvider;
List<Employee> employeeList;

ResponseState(this.dataState, this.dataProvider);
ResponseState(this.dataState, this.employeeList);
}
47 changes: 26 additions & 21 deletions basic_flutter/lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import 'package:basic_flutter/presentation/screens/employee_dialog.dart';
import 'package:flutter/material.dart';

import '/presentation/screens/employees_list_screen.dart';
import 'package:flutter/material.dart';

import './data/routes.dart';
import '/presentation/screens/employee_dialog.dart';

void main() {
runApp(const MyApp());
Expand All @@ -14,7 +15,7 @@ class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Employee App',
title: "Employee App",
home: const MyHomePage(),
routes: {
Routes.employeeListScreenRouteName: (context) =>
Expand All @@ -26,9 +27,10 @@ class MyApp extends StatelessWidget {
splashColor: Colors.blue,
textTheme: ThemeData.light().textTheme.copyWith(
headline6: const TextStyle(
fontFamily: 'Raleway-Bold',
fontSize: 20,
color: Colors.black),
fontFamily: 'Raleway-Bold',
fontSize: 20,
color: Colors.black,
),
),
),
);
Expand All @@ -46,21 +48,24 @@ class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Employee App'),
backgroundColor: Theme.of(context).primaryColor,
centerTitle: true,
appBar: AppBar(
title: const Text('Employee App'),
backgroundColor: Theme.of(context).primaryColor,
centerTitle: true,
),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.pushNamed(context, Routes.employeeListScreenRouteName);
},
child: const Text('Get Employees List'),
style: ButtonStyle(
backgroundColor:
MaterialStateProperty.all(Theme.of(context).primaryColor),
),
),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.pushNamed(
context, Routes.employeeListScreenRouteName);
},
child: const Text('Get Employees List'),
style: ButtonStyle(
backgroundColor:
MaterialStateProperty.all(Theme.of(context).primaryColor),
))));
),
);

}
}
65 changes: 12 additions & 53 deletions basic_flutter/lib/presentation/screens/employees_list_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,16 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter/material.dart';

import '/repository/data_provider.dart';
import '../widgets/list_item.dart';
import '/business_logic/cubits/response_cubit.dart';
import '/business_logic/cubits/response_state.dart';
import '/data/routes.dart';
import '../../business_logic/cubits/response_cubit.dart';
import '../../data/employee.dart';
import '../widgets/employee_bloc_builder.dart';

class EmployeesListScreen extends StatefulWidget {
static const url =
'https://app.swaggerhub.com/apis/flutterteam2/basic-flutter/1.0.0#/searchCriteria/post/employeemanagement/v1/employee/search/';
static const String deleteEmployeeEndpoint =
'https://virtserver.swaggerhub.com/flutterteam2/flutter/1.0.0/employeemanagement/v1/employee/';
static const searchEmployeeListEndpoint =
"https://virtserver.swaggerhub.com/flutterteam2/flutter/1.0.0/employeemanagement/v1/employee/search";


const EmployeesListScreen({Key? key}) : super(key: key);

Expand All @@ -19,6 +21,8 @@ class EmployeesListScreen extends StatefulWidget {

class _EmployeesListScreenState extends State<EmployeesListScreen> {
final DataProvider dataProvider = DataProvider();
final List<Employee> employeeList = [];


@override
Widget build(BuildContext context) {
Expand All @@ -30,53 +34,8 @@ class _EmployeesListScreenState extends State<EmployeesListScreen> {
backgroundColor: Theme.of(context).primaryColor,
),
body: BlocProvider(
create: (context) => ResponseCubit(dataProvider),
child: EmployeeBlocBuilder(dataProvider: dataProvider)),
);
}
}

class EmployeeBlocBuilder extends StatelessWidget {
const EmployeeBlocBuilder({Key? key, required this.dataProvider})
: super(key: key);
final DataProvider dataProvider;

@override
Widget build(BuildContext context) {
return BlocBuilder<ResponseCubit, ResponseState>(
builder: (context, state) {
if (state.dataState == DataLoadingStates.dataLoaded) {
return ListView.builder(
itemBuilder: (ctx, index) {
return ListItem(
index: index,
dataProvider: state.dataProvider,
);
},
itemCount: state.dataProvider.response.length,
);
} else if (state.dataState == DataLoadingStates.dataLoading) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(
Theme.of(context).primaryColor),
),
const SizedBox(height: 5),
Text(
'Data loading',
style: Theme.of(context).textTheme.headline6,
),
],
));
} else {
return Center(
child: Text('Data loading failed',
style: Theme.of(context).textTheme.headline6));
}
},
create: (context) => ResponseCubit(dataProvider, employeeList),
child: EmployeeBlocBuilder()),
);
}
}
60 changes: 60 additions & 0 deletions basic_flutter/lib/presentation/widgets/employee_bloc_builder.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

import '../widgets/list_item.dart';
import '../../business_logic/cubits/response_cubit.dart';
import '../../business_logic/cubits/response_state.dart';

class EmployeeBlocBuilder extends StatelessWidget {
const EmployeeBlocBuilder({
Key? key,
}) : super(key: key);

// use cubit dataprovider
// move deleteEmployeeEntry to ResponseCubit

@override
Widget build(BuildContext context) {
return BlocBuilder<ResponseCubit, ResponseState>(
builder: (context, state) {
if (state.dataState == DataLoadingStates.dataLoaded) {
return RefreshIndicator(
onRefresh: () => context.read<ResponseCubit>().getStateData(),
child: ListView.builder(
itemBuilder: (ctx, index) {
return ListItem(
index: index,
employeeList: state.employeeList,
);
},
itemCount: state.employeeList.length,
),
);
} else if (state.dataState == DataLoadingStates.dataLoading) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(
Theme.of(context).primaryColor),
),
const SizedBox(height: 5),
Text(
'Data loading',
style: Theme.of(context).textTheme.headline6,
),
],
));
} else {
return RefreshIndicator(
onRefresh: () => context.read<ResponseCubit>().getStateData(),
child: Center(
child: Text('Data loading failed',
style: Theme.of(context).textTheme.headline6)),
);
}
},
);
}
}
15 changes: 10 additions & 5 deletions basic_flutter/lib/presentation/widgets/list_item.dart
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
import 'package:flutter/material.dart';

import '/repository/data_provider.dart';
import '../../data/employee.dart';
import '../../data/routes.dart';

class ListItem extends StatelessWidget {
static const String employeesInsertEndpoint =
'https://app.swaggerhub.com/apis/flutterteam2/basic-flutter/1.0.0#/employeemanagement/v1/employee';
const ListItem({Key? key, required this.index, required this.dataProvider})
const ListItem({Key? key, required this.index, required this.employeeList})
: super(key: key);

final int index;
final DataProvider dataProvider;
final List<Employee> employeeList;

void _switchToEmployeePage(BuildContext context) {
Navigator.pushNamed(context, Routes.employeeDialogRouteName);
}


void _switchToEmployeePage(BuildContext context) {
Navigator.pushNamed(context, Routes.employeeDialogRouteName);
Expand All @@ -29,13 +34,13 @@ class ListItem extends StatelessWidget {
title: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
'${dataProvider.response[index].firstName} ${dataProvider.response[index].lastName} ',
'${employeeList[index].firstName} ${employeeList[index].lastName} ',
style: Theme.of(context).textTheme.headline6),
),
subtitle: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
dataProvider.response[index].email,
employeeList[index].email,
style: const TextStyle(
fontFamily: "Raleway-ExtraBold", fontSize: 16),
softWrap: true,
Expand Down