Let’s go step-by-step on how to create login and signup pages in Flutter, including UI, form validation, and navigation between both pages.
🧱 Step 1: Create a New Flutter Project
In your terminal or VS Code:
flutter create login_signup_app
cd login_signup_app
🧩 Step 2: Folder Structure (Recommended)
Organize your project like this:
lib/
┣ screens/
┃ ┣ login_screen.dart
┃ ┗ signup_screen.dart
┣ main.dart
🧮 Step 3: main.dart
Set up routes for navigation between login and signup pages.
import 'package:flutter/material.dart';
import 'screens/login_screen.dart';
import 'screens/signup_screen.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Login Signup Demo',
theme: ThemeData(primarySwatch: Colors.blue),
initialRoute: '/login',
routes: {
'/login': (context) => const LoginScreen(),
'/signup': (context) => const SignupScreen(),
},
);
}
}
🔐 Step 4: Create Login Screen
lib/screens/login_screen.dart
import 'package:flutter/material.dart';
class LoginScreen extends StatefulWidget {
const LoginScreen({super.key});
@override
State<LoginScreen> createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
final _formKey = GlobalKey<FormState>();
final emailController = TextEditingController();
final passwordController = TextEditingController();
void login() {
if (_formKey.currentState!.validate()) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Logging in...')),
);
// TODO: Add Firebase or API login logic here
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Login')),
body: Padding(
padding: const EdgeInsets.all(16),
child: Form(
key: _formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextFormField(
controller: emailController,
decoration: const InputDecoration(labelText: 'Email'),
validator: (value) =>
value!.isEmpty ? 'Please enter email' : null,
),
const SizedBox(height: 10),
TextFormField(
controller: passwordController,
decoration: const InputDecoration(labelText: 'Password'),
obscureText: true,
validator: (value) =>
value!.isEmpty ? 'Please enter password' : null,
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: login,
child: const Text('Login'),
),
TextButton(
onPressed: () {
Navigator.pushReplacementNamed(context, '/signup');
},
child: const Text("Don't have an account? Sign up"),
)
],
),
),
),
);
}
}
📝 Step 5: Create Signup Screen
lib/screens/signup_screen.dart
import 'package:flutter/material.dart';
class SignupScreen extends StatefulWidget {
const SignupScreen({super.key});
@override
State<SignupScreen> createState() => _SignupScreenState();
}
class _SignupScreenState extends State<SignupScreen> {
final _formKey = GlobalKey<FormState>();
final nameController = TextEditingController();
final emailController = TextEditingController();
final passwordController = TextEditingController();
void signup() {
if (_formKey.currentState!.validate()) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Signing up...')),
);
// TODO: Add Firebase or API signup logic here
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Signup')),
body: Padding(
padding: const EdgeInsets.all(16),
child: Form(
key: _formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextFormField(
controller: nameController,
decoration: const InputDecoration(labelText: 'Full Name'),
validator: (value) =>
value!.isEmpty ? 'Please enter your name' : null,
),
const SizedBox(height: 10),
TextFormField(
controller: emailController,
decoration: const InputDecoration(labelText: 'Email'),
validator: (value) =>
value!.isEmpty ? 'Please enter email' : null,
),
const SizedBox(height: 10),
TextFormField(
controller: passwordController,
decoration: const InputDecoration(labelText: 'Password'),
obscureText: true,
validator: (value) =>
value!.isEmpty ? 'Please enter password' : null,
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: signup,
child: const Text('Sign Up'),
),
TextButton(
onPressed: () {
Navigator.pushReplacementNamed(context, '/login');
},
child: const Text("Already have an account? Login"),
)
],
),
),
),
);
}
}
🚀 Step 6: Run the App
flutter run
You’ll see a simple Login Page → Signup Page navigation working with form validation.
💡 Next Steps
To make it production-ready:
- Add Firebase Authentication → [I can show you step-by-step setup next]
- Use Bloc or Provider for managing auth state.
- Use SharedPreferences or SecureStorage for saving user sessions.
- Add email/password validation, loading indicators, and error handling.
2 comments
[…] How to create login and signup page using flutter […]
[…] a simple quiz app using Flutter is a great beginner project — it’ll help you learn state management, navigation, and UI design. […]