Flutter PHP MySQL Login and Register Tutorial With UI. Copy and paste the below code as per your requirements.
Taking Permission of Internet for API Calling
<uses-permission android:name="android.permission.INTERNET" />
android:usesCleartextTraffic="true"
pubspec.yaml
cupertino_icons: ^1.0.2
google_fonts: ^1.1.0
flutter_icons: ^1.1.0
http: ^0.12.0+2 #to interact with api
fluttertoast:
main.dart
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:example/login.dart';
import 'package:example/login_option.dart';
import 'package:example/signup.dart';
import 'package:example/signup_option.dart';
import 'dart:ui' as ui;
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
textTheme: GoogleFonts.muktaVaaniTextTheme(),
),
debugShowCheckedModeBanner: false,
home: const HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
bool login = true;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color(0xFF1C1C1C),
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
GestureDetector(
onTap: () {
setState(() {
login = true;
});
},
child: AnimatedContainer(
duration: const Duration(milliseconds: 500),
curve: Curves.ease,
height: login ? MediaQuery.of(context).size.height * 0.6 : MediaQuery.of(context).size.height * 0.4,
child: CustomPaint(
painter: CurvePainter(login),
child: Container(
padding: EdgeInsets.only(bottom: login ? 0 : 55),
child: Center(
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 16),
child: login
? const Login()
: const LoginOption(),
),
),
),
),
),
),
),
GestureDetector(
onTap: () {
setState(() {
login = false;
});
},
child: AnimatedContainer(
duration: const Duration(milliseconds: 500),
curve: Curves.ease,
height: login ? MediaQuery.of(context).size.height * 0.4 : MediaQuery.of(context).size.height * 0.6,
child: Container(
color: Colors.transparent,
padding: EdgeInsets.only(top: login ? 55 : 0),
child: Center(
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 16),
child: !login
? SignUp()
: const SignUpOption(),
),
),
)
),
),
),
],
),
),
);
}
}
class CurvePainter extends CustomPainter {
bool outterCurve;
CurvePainter(this.outterCurve);
@override
void paint(Canvas canvas, Size size) {
var paint = Paint();
paint.shader = const RadialGradient(
colors: [
Colors.blue,
Colors.purpleAccent,
],
).createShader(Rect.fromCircle(
radius: 600, center: const Offset(50, 50),
));
paint.style = PaintingStyle.fill;
Path path = Path();
path.moveTo(0, 0);
path.lineTo(0, size.height);
path.quadraticBezierTo(size.width * 0.5, outterCurve ? size.height + 110 : size.height - 110, size.width, size.height);
path.lineTo(size.width, 0);
path.close();
canvas.drawPath(path, paint);
}
@override
bool shouldRepaint(CustomPainter oldDelegate) => false;
}
signup.dart
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_icons/flutter_icons.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart' as http;
import 'Dashboard.dart';
class SignUp extends StatefulWidget {
const SignUp({Key? key}) : super(key: key);
@override
_SignUpState createState() => _SignUpState();
}
class _SignUpState extends State<SignUp> {
TextEditingController user = TextEditingController();
TextEditingController pass = TextEditingController();
Future register() async {
var url = Uri.http("192.168.0.105", '/login/register.php', {'q': '{http}'});
var response = await http.post(url, body: {
"username": user.text.toString(),
"password": pass.text.toString(),
});
var data = json.decode(response.body);
if (data == "Error") {
Fluttertoast.showToast(
backgroundColor: Colors.orange,
textColor: Colors.white,
msg: 'User already exit!',
toastLength: Toast.LENGTH_SHORT,
);
} else {
Fluttertoast.showToast(
backgroundColor: Colors.green,
textColor: Colors.white,
msg: 'Registration Successful',
toastLength: Toast.LENGTH_SHORT,
);
Navigator.push(context,
MaterialPageRoute(
builder: (context) => const DashBoard(),
),
);
}
}
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
"Sign up with",
style: TextStyle(
fontSize: 16,
color: Color(0xFFF3D657),
height: 2,
),
),
const Text(
"Nilen Patel Inc.",
style: TextStyle(
fontSize: 36,
fontWeight: FontWeight.bold,
color: Color(0xFFF3D657),
letterSpacing: 2,
height: 1,
),
),
const SizedBox(
height: 16,
),
TextField(
style: const TextStyle(color: Colors.white),
controller: user,
decoration: InputDecoration(
hintText: 'Enter Email / Username',
hintStyle: const TextStyle(
fontSize: 16,
color: Colors.white70,
fontWeight: FontWeight.bold,
),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(25),
borderSide: const BorderSide(
width: 0,
style: BorderStyle.none,
),
),
filled: true,
fillColor: Colors.grey.withOpacity(0.1),
contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 0),
),
),
const SizedBox(
height: 16,
),
TextField(
style: const TextStyle(color: Colors.white),
obscureText: true,
controller: pass,
decoration: InputDecoration(
hintText: 'Password',
hintStyle: const TextStyle(
fontSize: 16,
color: Colors.white70,
fontWeight: FontWeight.bold,
),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(25),
borderSide: const BorderSide(
width: 0,
style: BorderStyle.none,
),
),
filled: true,
fillColor: Colors.grey.withOpacity(0.1),
contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 0),
),
),
const SizedBox(
height: 24,
),
Container(
height: 40,
decoration: BoxDecoration(
color: const Color(0xFFF3D657),
borderRadius: const BorderRadius.all(
Radius.circular(25),
),
boxShadow: [
BoxShadow(
color: const Color(0xFFF3D657).withOpacity(0.2),
spreadRadius: 3,
blurRadius: 4,
offset: const Offset(0, 3),
),
],
),
child: Center(
child: GestureDetector(
onTap: register,
child: const Text(
"SIGN UP",
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: Color(0xFF1C1C1C),
),
),
)
),
),
const SizedBox(
height: 24,
),
const Text(
"Or Signup with",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 16,
color: Color(0xFFF3D657),
height: 1,
),
),
const SizedBox(
height: 16,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: const <Widget>[
Icon(
Entypo.facebook_with_circle,
size: 32,
color: Color(0xFFF3D657),
),
SizedBox(
width: 24,
),
Icon(
Entypo.google__with_circle,
size: 32,
color: Color(0xFFF3D657),
),
],
)
],
);
}
}
signup_option.dart
import 'package:flutter/material.dart';
class SignUpOption extends StatelessWidget {
const SignUpOption({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
"OR",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
height: 1,
color: Color(0xFFF3D657),
),
),
const SizedBox(
height: 24,
),
Container(
height: 40,
decoration: BoxDecoration(
color: const Color(0xFFF3D657),
borderRadius: const BorderRadius.all(
Radius.circular(25),
),
boxShadow: [
BoxShadow(
color: const Color(0xFFF3D657).withOpacity(0.2),
spreadRadius: 3,
blurRadius: 4,
offset: const Offset(0, 3),
),
],
),
child: const Center(
child: Text(
"SIGN UP",
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: Color(0xFF1C1C1C),
),
),
),
),
],
);
}
}
login.dart
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart' as http;
import 'Dashboard.dart';
class Login extends StatefulWidget {
const Login({Key? key}) : super(key: key);
@override
_LoginPageState createState() => _LoginPageState();
}
class _LoginPageState extends State<Login> {
TextEditingController user = TextEditingController();
TextEditingController pass = TextEditingController();
Future login() async {
var url = Uri.http("192.168.0.105", '/login/login.php', {'q': '{http}'});
var response = await http.post(url, body: {
"username": user.text,
"password": pass.text,
});
var data = json.decode(response.body);
if (data.toString() == "Success") {
Fluttertoast.showToast(
msg: 'Login Successful',
backgroundColor: Colors.green,
textColor: Colors.white,
toastLength: Toast.LENGTH_SHORT,
);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const DashBoard(),
),
);
} else {
Fluttertoast.showToast(
backgroundColor: Colors.red,
textColor: Colors.white,
msg: 'Username and password invalid',
toastLength: Toast.LENGTH_SHORT,
);
}
}
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
"Welcome to",
style: TextStyle(
fontSize: 16,
color: Color(0xFF1C1C1C),
height: 2,
),
),
const Text(
"Nilen Patel Inc.",
style: TextStyle(
fontSize: 36,
fontWeight: FontWeight.bold,
color: Color(0xFF1C1C1C),
letterSpacing: 2,
height: 1,
),
),
const Text(
"Please login to continue",
style: TextStyle(
fontSize: 16,
color: Color(0xFF1C1C1C),
height: 1,
),
),
const SizedBox(
height: 16,
),
TextField(
controller: user,
style: const TextStyle(color: Colors.white),
decoration: InputDecoration(
hintText: 'Email / Username',
hintStyle: const TextStyle(
fontSize: 16,
color: Colors.white,
fontWeight: FontWeight.bold,
),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(25),
borderSide: const BorderSide(
width: 0,
style: BorderStyle.none,
),
),
filled: true,
fillColor: Colors.black,
contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 0),
),
),
const SizedBox(
height: 16,
),
TextField(
obscureText: true,
style: const TextStyle(color: Colors.white),
controller: pass,
decoration: InputDecoration(
hintText: 'Password',
hintStyle: const TextStyle(
fontSize: 16,
color: Colors.white,
fontWeight: FontWeight.bold,
),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(25),
borderSide: const BorderSide(
width: 0,
style: BorderStyle.none,
),
),
filled: true,
fillColor: Colors.black,
contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 0),
),
),
const SizedBox(
height: 24,
),
Container(
height: 40,
decoration: BoxDecoration(
color: const Color(0xFF1C1C1C),
borderRadius: const BorderRadius.all(
Radius.circular(25),
),
boxShadow: [
BoxShadow(
color: const Color(0xFF1C1C1C).withOpacity(0.2),
spreadRadius: 3,
blurRadius: 4,
offset: const Offset(0, 3),
),
],
),
child: Center(
child: GestureDetector(
onTap: login,
child: const Text(
"LOGIN",
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
)
),
),
const SizedBox(
height: 16,
),
const Text(
"FORGOT PASSWORD?",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: Color(0xFF1C1C1C),
height: 1,
),
),
],
);
}
}
login_option.dart
import 'package:flutter/material.dart';
class LoginOption extends StatelessWidget {
const LoginOption({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
"Existing user?",
style: TextStyle(
fontSize: 16,
),
),
const SizedBox(
height: 16,
),
Container(
height: 40,
decoration: BoxDecoration(
color: const Color(0xFF1C1C1C),
borderRadius: const BorderRadius.all(
Radius.circular(25),
),
boxShadow: [
BoxShadow(
color: const Color(0xFF1C1C1C).withOpacity(0.2),
spreadRadius: 3,
blurRadius: 4,
offset: const Offset(0, 3),
),
],
),
child: const Center(
child: Text(
"LOGIN",
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
),
),
],
);
}
}
Dashboard.dart
import 'package:flutter/material.dart';
class DashBoard extends StatelessWidget {
const DashBoard({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Dashboard'),),
body: const Center(child: Text('Dashboard')),
);
}
}
login.php
<?php
$db = mysqli_connect('localhost','root','','userdata');
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username = '".$username."' AND password = '".$password."'";
$result = mysqli_query($db,$sql);
$count = mysqli_num_rows($result);
if($count == 1){
echo json_encode("Success");
}
else{
echo json_encode("Error");
}
?>
register.php
<?php
$db = mysqli_connect('localhost','root','','userdata');
if(!$db)
{
echo "Database connection failed";
}
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT username FROM users WHERE username = '".$username."'";
$result = mysqli_query($db,$sql);
$count = mysqli_num_rows($result);
if($count == 1){
echo json_encode("Error");
}else{
$insert = "INSERT INTO users(username,password) VALUES ('".$username."','".$password."')";
$query = mysqli_query($db,$insert);
if($query){
echo json_encode("Success");
}
}
?>
2 responses to “Flutter #112: Flutter PHP MySQL Login and Register Tutorial With UI”
where put the php files?
On the server