Flutter #108: Flutter Laravel CRUD PHP | Flutter Rest API | Flutter Http Post Request. Copy and paste the below code as per your requirements.
2022_05_03_101103_create_employees_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateEmployeesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('employees', function (Blueprint $table) {
$table->id();
$table->string('first_name');
$table->string('last_name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('employees');
}
}
RouteServiceProvider.php
uncomment this line…
protected $namespace = 'App\\Http\\Controllers';
EmployeeController.php
<?php
namespace App\Http\Controllers;
use App\Models\Employee;
use Illuminate\Http\Request;
class EmployeeController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$employees = Employee::all();
return response()->json($employees);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$input = $request->validate([
'first_name' => 'required',
'last_name' => 'required',
]);
$employee = new Employee();
$employee->first_name = $input['first_name'];
$employee->last_name = $input['last_name'];
$employee->save();
return response()->json($employee);
}
/**
* Display the specified resource.
*
* @param \App\Models\Employee $employee
* @return \Illuminate\Http\Response
*/
public function show(Employee $employee)
{
return response()->json($employee);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Employee $employee
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Employee $employee)
{
$input = $request->validate([
'first_name' => 'required',
'last_name' => 'required',
]);
$employee->first_name = $input['first_name'];
$employee->last_name = $input['last_name'];
$employee->save();
return response()->json($employee);
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Employee $employee
* @return \Illuminate\Http\Response
*/
public function destroy(Employee $employee)
{
return response()->json($employee->delete());
}
}
api.php
Route::apiResources([
'/employees' => EmployeeController::class,
]);
main.dart
import 'package:flutter/material.dart';
import 'DataTableDemo.dart';
void main() {
runApp(
HomeApp(),
);
}
class HomeApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: DataTableDemo(),
);
}
}
DataTableDemo.dart
import 'package:flutter/material.dart';
import 'Employees.dart';
import 'Services.dart';
class DataTableDemo extends StatefulWidget {
DataTableDemo() : super();
final String title = "Flutter Laravel CRUD";
@override
DataTableDemoState createState() => DataTableDemoState();
}
class DataTableDemoState extends State<DataTableDemo> {
late List<Employee> _employees;
late GlobalKey<ScaffoldState> _scaffoldKey;
late TextEditingController _firstNameController;
late TextEditingController _lastNameController;
late Employee _selectedEmployee;
late bool _isUpdating;
late String _titleProgress;
@override
void initState() {
super.initState();
_employees = [];
_isUpdating = false;
_titleProgress = widget.title;
_scaffoldKey = GlobalKey();
_firstNameController = TextEditingController();
_lastNameController = TextEditingController();
_getEmployees();
}
_showProgress(String message) {
setState(() {
_titleProgress = message;
});
}
_addEmployee() {
if (_firstNameController.text
.trim()
.isEmpty ||
_lastNameController.text
.trim()
.isEmpty) {
print("Empty fields");
return;
}
_showProgress('Adding Employee...');
Services.addEmployee(_firstNameController.text, _lastNameController.text)
.then((result) {
if (result) {
_getEmployees();
}
_clearValues();
});
}
_getEmployees() {
_showProgress('Loading Employees...');
Services.getEmployees().then((employees) {
setState(() {
_employees = employees;
});
_showProgress(widget.title);
print("Length: ${employees.length}");
});
}
_deleteEmployee(Employee employee) {
_showProgress('Deleting Employee...');
Services.deleteEmployee(employee.id).then((result) {
if (result) {
setState(() {
_employees.remove(employee);
});
_getEmployees();
}
});
}
_updateEmployee(Employee employee) {
_showProgress('Updating Employee...');
Services.updateEmployee(
employee.id, _firstNameController.text, _lastNameController.text)
.then((result) {
if (result) {
_getEmployees();
setState(() {
_isUpdating = false;
});
_firstNameController.text = '';
_lastNameController.text = '';
}
});
}
_setValues(Employee employee) {
_firstNameController.text = employee.firstName;
_lastNameController.text = employee.lastName;
setState(() {
_isUpdating = true;
});
}
_clearValues() {
_firstNameController.text = '';
_lastNameController.text = '';
}
SingleChildScrollView _dataBody() {
return SingleChildScrollView(
scrollDirection: Axis.vertical,
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: DataTable(
dataTextStyle: TextStyle(color: Colors.white),
headingRowColor: MaterialStateColor.resolveWith((states) => Colors.teal),
dataRowColor: MaterialStateColor.resolveWith((Set<MaterialState> states) => states.contains(MaterialState.selected)
? Colors.white
: Colors.black
),
columns: [
DataColumn(
label: Text("ID"),
numeric: false,
tooltip: "This is the employee id"),
DataColumn(
label: Text(
"FIRST",
),
numeric: false,
tooltip: "This is the last name"),
DataColumn(
label: Text("LAST"),
numeric: false,
tooltip: "This is the last name"),
DataColumn(
label: Text("DELETE"),
numeric: false,
tooltip: "Delete Action"),
],
rows: _employees.map(
(employee) =>
DataRow(
cells: [
DataCell(
Text(employee.id),
onTap: () {
print("Tapped " + employee.firstName);
_setValues(employee);
_selectedEmployee = employee;
},
),
DataCell(
Text(
employee.firstName.toUpperCase(),
),
onTap: () {
print("Tapped " + employee.firstName);
_setValues(employee);
_selectedEmployee = employee;
},
),
DataCell(
Text(
employee.lastName.toUpperCase(),
),
onTap: () {
print("Tapped " + employee.firstName);
_setValues(employee);
_selectedEmployee = employee;
},
),
DataCell(
IconButton(
icon: Icon(Icons.delete,color: Colors.redAccent,),
onPressed: () {
_deleteEmployee(employee);
},
),
onTap: () {
print("Tapped " + employee.firstName);
},
),
],
),
)
.toList(),
),
),
);
}
showSnackBar(context, message) {
_scaffoldKey.currentState!.showSnackBar(SnackBar(
content: Text(message),
));
}
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
appBar: AppBar(
backgroundColor: Colors.redAccent,
title: Text(_titleProgress),
actions: <Widget>[
IconButton(
icon: Icon(Icons.refresh),
onPressed: () {
_getEmployees();
},
),
],
),
body: Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Padding(
padding: EdgeInsets.all(20.0),
child: TextField(
controller: _firstNameController,
decoration: InputDecoration.collapsed(
hintText: "First Name",
),
),
),
Padding(
padding: EdgeInsets.all(20.0),
child: TextField(
controller: _lastNameController,
decoration: InputDecoration.collapsed(
hintText: "Last Name",
),
),
),
_isUpdating
? Row(
children: <Widget>[
OutlineButton(
child: Text('UPDATE'),
onPressed: () {
_updateEmployee(_selectedEmployee);
},
),
OutlineButton(
child: Text('CANCEL'),
onPressed: () {
setState(() {
_isUpdating = false;
});
_clearValues();
},
),
],
)
: Container(),
Expanded(
child: _dataBody(),
)
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
_addEmployee();
},
child: Icon(Icons.add),
),
);
}
}
Employees.dart
class Employee {
String id;
String firstName;
String lastName;
Employee({required this.id, required this.firstName, required this.lastName});
factory Employee.fromJson(Map<String, dynamic> json) {
return Employee(
id: json['id'].toString(),
firstName: json['first_name'].toString(),
lastName: json['last_name'].toString(),
);
}
}
Services.dart
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'Employees.dart';
class Services {
static const ROOT = 'http://192.168.0.104:8000/api/employees/';
static const _CREATE_TABLE_ACTION = 'CREATE_TABLE';
static const _GET_ALL_ACTION = 'GET_ALL';
static const _ADD_EMP_ACTION = 'ADD_EMP';
static const _UPDATE_EMP_ACTION = 'UPDATE_EMP';
static const _DELETE_EMP_ACTION = 'DELETE_EMP';
static Future<List<Employee>> getEmployees() async {
try {
var map = Map<String, dynamic>();
map['action'] = _GET_ALL_ACTION;
final response = await http.get(Uri.parse(ROOT));
print('getEmployees Response: ${response.body}');
print(response.statusCode);
print(200 == response.statusCode);
if (200 == response.statusCode) {
List<Employee> list = parseResponse(response.body);
print(list.length);
return list;
} else {
return <Employee>[];
}
} catch (e) {
return <Employee>[];
}
}
static List<Employee> parseResponse(String responseBody) {
final parsed = json.decode(responseBody);
print(parsed);
return parsed.map<Employee>((json) => Employee.fromJson(json)).toList();
}
static Future<bool> addEmployee(String firstName, String lastName) async {
try {
var map = Map<String, dynamic>();
map['action'] = _ADD_EMP_ACTION;
map['first_name'] = firstName;
map['last_name'] = lastName;
final response = await http.post(Uri.parse(ROOT), body: map);
print('addEmployee Response: ${response.body}');
if (200 == response.statusCode) {
return true;
} else {
return false;
}
} catch (e) {
return false;
}
}
static Future<bool> updateEmployee(String empId, String firstName,
String lastName) async {
try {
var map = Map<String, dynamic>();
map['action'] = _UPDATE_EMP_ACTION;
map['id'] = empId;
map['first_name'] = firstName;
map['last_name'] = lastName;
final response = await http.put(Uri.parse(ROOT + empId), body: map);
print('updateEmployee Response: ${response.body}');
if (200 == response.statusCode) {
return true;
} else {
return false;
}
} catch (e) {
return false;
}
}
static Future<bool> deleteEmployee(String empId) async {
try {
final response = await http.delete(Uri.parse(ROOT + empId));
print('deleteEmployee Response: ${response.body}');
if (200 == response.statusCode) {
return true;
} else {
return false;
}
} catch (e) {
return false;
}
}
}