<project>
<projectName>DeliveryApp</projectName>
<projectDescription>
A Flutter mobile application for delivery services with user and admin authentication, order management, and real-time updates.
</projectDescription>
<projectDependencies>
<dependency>flutter: ^3.0.0</dependency>
<dependency>firebase_core: ^2.4.1</dependency>
<dependency>firebase_auth: ^4.2.1</dependency>
<dependency>cloud_firestore: ^4.3.1</dependency>
<dependency>firebase_messaging: ^14.1.1</dependency>
<dependency>provider: ^6.0.5</dependency>
<dependency>google_fonts: ^4.0.3</dependency>
<dependency>flutter_localizations: ^2.0.0</dependency>
<dependency>intl: ^0.18.0</dependency>
</projectDependencies>
<projectStructure>
<directory>lib</directory>
<directory>lib/models</directory>
<directory>lib/screens</directory>
<directory>lib/services</directory>
<directory>lib/providers</directory>
<directory>lib/widgets</directory>
</projectStructure>
</project>
<project>
<projectName>DeliveryApp</projectName>
<projectDescription>
A Flutter mobile application for delivery services with user and admin authentication, order management, and real-time updates.
</projectDescription>
<projectDependencies>
<dependency>flutter: ^3.0.0</dependency>
<dependency>firebase_core: ^2.4.1</dependency>
<dependency>firebase_auth: ^4.2.1</dependency>
<dependency>cloud_firestore: ^4.3.1</dependency>
<dependency>firebase_messaging: ^14.1.1</dependency>
<dependency>provider: ^6.0.5</dependency>
<dependency>google_fonts: ^4.0.3</dependency>
<dependency>flutter_localizations: ^2.0.0</dependency>
<dependency>intl: ^0.18.0</dependency>
</projectDependencies>
<projectStructure>
<directory>lib</directory>
<directory>lib/models</directory>
<directory>lib/screens</directory>
<directory>lib/services</directory>
<directory>lib/providers</directory>
<directory>lib/widgets</directory>
</projectStructure>
</project>
// lib/main.dart
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:provider/provider.dart';
import 'providers/auth_provider.dart';
import 'providers/theme_provider.dart';
import 'screens/splash_screen.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => AuthProvider()),
ChangeNotifierProvider(create: (_) => ThemeProvider()),
],
child: const MyApp(),
),
);
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
final themeProvider = Provider.of<ThemeProvider>(context);
return MaterialApp(
title: 'Delivery App',
theme: themeProvider.currentTheme,
home: const SplashScreen(),
debugShowCheckedModeBanner: false,
);
}
}
// lib/main.dart
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:provider/provider.dart';
import 'providers/auth_provider.dart';
import 'providers/theme_provider.dart';
import 'screens/splash_screen.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => AuthProvider()),
ChangeNotifierProvider(create: (_) => ThemeProvider()),
],
child: const MyApp(),
),
);
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
final themeProvider = Provider.of<ThemeProvider>(context);
return MaterialApp(
title: 'Delivery App',
theme: themeProvider.currentTheme,
home: const SplashScreen(),
debugShowCheckedModeBanner: false,
);
}
}
// lib/models/user_model.dart
class UserModel {
final String uid;
final String email;
final String name;
final String role;
final DateTime createdAt;
UserModel({
required this.uid,
required this.email,
required this.name,
required this.role,
required this.createdAt,
});
factory UserModel.fromMap(Map<String, dynamic> map) {
return UserModel(
uid: map['uid'],
email: map['email'],
name: map['name'],
role: map['role'],
createdAt: map['createdAt'].toDate(),
);
}
Map<String, dynamic> toMap() {
return {
'uid': uid,
'email': email,
'name': name,
'role': role,
'createdAt': createdAt,
};
}
}
// lib/models/user_model.dart
class UserModel {
final String uid;
final String email;
final String name;
final String role;
final DateTime createdAt;
UserModel({
required this.uid,
required this.email,
required this.name,
required this.role,
required this.createdAt,
});
factory UserModel.fromMap(Map<String, dynamic> map) {
return UserModel(
uid: map['uid'],
email: map['email'],
name: map['name'],
role: map['role'],
createdAt: map['createdAt'].toDate(),
);
}
Map<String, dynamic> toMap() {
return {
'uid': uid,
'email': email,
'name': name,
'role': role,
'createdAt': createdAt,
};
}
}
// lib/models/order_model.dart
class OrderModel {
final String id;
final String userId;
final List<Map<String, dynamic>> items;
final double totalPrice;
final String status;
final DateTime createdAt;
final String deliveryAddress;
OrderModel({
required this.id,
required this.userId,
required this.items,
required this.totalPrice,
required this.status,
required this.createdAt,
required this.deliveryAddress,
});
factory OrderModel.fromMap(Map<String, dynamic> map) {
return OrderModel(
id: map['id'],
userId: map['userId'],
items: List<Map<String, dynamic>>.from(map['items']),
totalPrice: map['totalPrice'],
status: map['status'],
createdAt: map['createdAt'].toDate(),
deliveryAddress: map['deliveryAddress'],
);
}
Map<String, dynamic> toMap() {
return {
'id': id,
'userId': userId,
'items': items,
'totalPrice': totalPrice,
'status': status,
'createdAt': createdAt,
'deliveryAddress': deliveryAddress,
};
}
}
// lib/models/order_model.dart
class OrderModel {
final String id;
final String userId;
final List<Map<String, dynamic>> items;
final double totalPrice;
final String status;
final DateTime createdAt;
final String deliveryAddress;
OrderModel({
required this.id,
required this.userId,
required this.items,
required this.totalPrice,
required this.status,
required this.createdAt,
required this.deliveryAddress,
});
factory OrderModel.fromMap(Map<String, dynamic> map) {
return OrderModel(
id: map['id'],
userId: map['userId'],
items: List<Map<String, dynamic>>.from(map['items']),
totalPrice: map['totalPrice'],
status: map['status'],
createdAt: map['createdAt'].toDate(),
deliveryAddress: map['deliveryAddress'],
);
}
Map<String, dynamic> toMap() {
return {
'id': id,
'userId': userId,
'items': items,
'totalPrice': totalPrice,
'status': status,
'createdAt': createdAt,
'deliveryAddress': deliveryAddress,
};
}
}
// lib/providers/auth_provider.dart
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import '../models/user_model.dart';
class AuthProvider with ChangeNotifier {
UserModel? _user;
UserModel? get user => _user;
Future<void> signInWithEmailAndPassword(
String email, String password) async {
try {
final authResult = await FirebaseAuth.instance
.signInWithEmailAndPassword(email: email, password: password);
await _fetchUserData(authResult.user!.uid);
} catch (error) {
rethrow;
}
}
Future<void> signUpWithEmailAndPassword(
String email, String password, String name, String role) async {
try {
final authResult = await FirebaseAuth.instance
.createUserWithEmailAndPassword(email: email, password: password);
await _saveUserData(
authResult.user!.uid,
email,
name,
role,
);
} catch (error) {
rethrow;
}
}
Future<void> _saveUserData(
String uid, String email, String name, String role) async {
final user = UserModel(
uid: uid,
email: email,
name: name,
role: role,
createdAt: DateTime.now(),
);
await FirebaseFirestore.instance
.collection('users')
.doc(uid)
.set(user.toMap());
_user = user;
notifyListeners();
}
Future<void> _fetchUserData(String uid) async {
final doc =
await FirebaseFirestore.instance.collection('users').doc(uid).get();
if (doc.exists) {
_user = UserModel.fromMap(doc.data()!);
notifyListeners();
}
}
Future<void> signOut() async {
await FirebaseAuth.instance.signOut();
_user = null;
notifyListeners();
}
}
// lib/providers/auth_provider.dart
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import '../models/user_model.dart';
class AuthProvider with ChangeNotifier {
UserModel? _user;
UserModel? get user => _user;
Future<void> signInWithEmailAndPassword(
String email, String password) async {
try {
final authResult = await FirebaseAuth.instance
.signInWithEmailAndPassword(email: email, password: password);
await _fetchUserData(authResult.user!.uid);
} catch (error) {
rethrow;
}
}
Future<void> signUpWithEmailAndPassword(
String email, String password, String name, String role) async {
try {
final authResult = await FirebaseAuth.instance
.createUserWithEmailAndPassword(email: email, password: password);
await _saveUserData(
authResult.user!.uid,
email,
name,
role,
);
} catch (error) {
rethrow;
}
}
Future<void> _saveUserData(
String uid, String email, String name, String role) async {
final user = UserModel(
uid: uid,
email: email,
name: name,
role: role,
createdAt: DateTime.now(),
);
await FirebaseFirestore.instance
.collection('users')
.doc(uid)
.set(user.toMap());
_user = user;
notifyListeners();
}
Future<void> _fetchUserData(String uid) async {
final doc =
await FirebaseFirestore.instance.collection('users').doc(uid).get();
if (doc.exists) {
_user = UserModel.fromMap(doc.data()!);
notifyListeners();
}
}
Future<void> signOut() async {
await FirebaseAuth.instance.signOut();
_user = null;
notifyListeners();
}
}
// lib/providers/theme_provider.dart
import 'package:flutter/material.dart';
class ThemeProvider with ChangeNotifier {
ThemeMode _themeMode = ThemeMode.light;
ThemeMode get currentTheme => _themeMode;
void toggleTheme() {
_themeMode =
_themeMode == ThemeMode.light ? ThemeMode.dark : ThemeMode.light;
notifyListeners();
}
}
// lib/providers/theme_provider.dart
import 'package:flutter/material.dart';
class ThemeProvider with ChangeNotifier {
ThemeMode _themeMode = ThemeMode.light;
ThemeMode get currentTheme => _themeMode;
void toggleTheme() {
_themeMode =
_themeMode == ThemeMode.light ? ThemeMode.dark : ThemeMode.light;
notifyListeners();
}
}
// lib/screens/auth/login_screen.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../providers/auth_provider.dart';
class LoginScreen extends StatefulWidget {
const LoginScreen({Key? key}) : super(key: key);
@override
State<LoginScreen> createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
final _formKey = GlobalKey<FormState>();
final _emailController = TextEditingController();
final _passwordController = TextEditingController();
bool _isLoading = false;
bool _obscureText = true;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Login
// lib/screens/auth/login_screen.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../providers/auth_provider.dart';
class LoginScreen extends StatefulWidget {
const LoginScreen({Key? key}) : super(key: key);
@override
State<LoginScreen> createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
final _formKey = GlobalKey<FormState>();
final _emailController = TextEditingController();
final _passwordController = TextEditingController();
bool _isLoading = false;
bool _obscureText = true;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Login
I'll continue with the remaining files for the Flutter delivery app. Here's the comprehensive solution:
Here's the updated code for the splash screen with a more polished design and animation:
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../providers/auth_provider.dart';
class SplashScreen extends StatefulWidget {
const SplashScreen({Key? key}) : super(key: key);
@override
State<SplashScreen> createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _animation;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(milliseconds: 1500),
vsync: this,
)..repeat(reverse: true);
_animation = CurvedAnimation(
parent: _controller,
curve: Curves.easeInOut,
);
_checkAuthStatus();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
Future<void> _checkAuthStatus() async {
await Future.delayed(const Duration(seconds: 2));
final authProvider = Provider.of<AuthProvider>(context, listen: false);
if (authProvider.user != null) {
if (authProvider.user?.role == 'admin') {
Navigator.pushReplacementNamed(context, '/admin/dashboard');
} else {
Navigator.pushReplacementNamed(context, '/user/home');
}
} else {
Navigator.pushReplacementNamed(context, '/login');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Theme.of(context).primaryColor,
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ScaleTransition(
scale: _animation,
child: Image.asset(
'assets/logo.png',
width: 150,
height: 150,
color: Colors.white,
),
),
const SizedBox(height: 20),
FadeTransition(
opacity: _animation,
child: Text(
'Delivery App',
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
),
const SizedBox(height: 20),
CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(Colors.white),
),
],
),
),
);
}
}
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../providers/auth_provider.dart';
class SplashScreen extends StatefulWidget {
const SplashScreen({Key? key}) : super(key: key);
@override
State<SplashScreen> createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _animation;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(milliseconds: 1500),
vsync: this,
)..repeat(reverse: true);
_animation = CurvedAnimation(
parent: _controller,
curve: Curves.easeInOut,
);
_checkAuthStatus();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
Future<void> _checkAuthStatus() async {
await Future.delayed(const Duration(seconds: 2));
final authProvider = Provider.of<AuthProvider>(context, listen: false);
if (authProvider.user != null) {
if (authProvider.user?.role == 'admin') {
Navigator.pushReplacementNamed(context, '/admin/dashboard');
} else {
Navigator.pushReplacementNamed(context, '/user/home');
}
} else {
Navigator.pushReplacementNamed(context, '/login');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Theme.of(context).primaryColor,
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ScaleTransition(
scale: _animation,
child: Image.asset(
'assets/logo.png',
width: 150,
height: 150,
color: Colors.white,
),
),
const SizedBox(height: 20),
FadeTransition(
opacity: _animation,
child: Text(
'Delivery App',
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
),
const SizedBox(height: 20),
CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(Colors.white),
),
],
),
),
);
}
}
To use this splash screen, you'll need to:
assets/logo.png)pubspec.yaml to include the asset:flutter:
assets:
- assets/logo.png
flutter:
assets:
- assets/logo.png
void main() {
runApp(
MaterialApp(
title: 'Delivery App',
theme: ThemeData.light(),
darkTheme: ThemeData.dark(),
home: SplashScreen(),
debugShowCheckedModeBanner: false,
),
);
}
void main() {
runApp(
MaterialApp(
title: 'Delivery App',
theme: ThemeData.light(),
darkTheme: ThemeData.dark(),
home: SplashScreen(),
debugShowCheckedModeBanner: false,
),
);
}
This splash screen includes:
The splash screen will:
Here's how to enhance your delivery app with 3D UI elements using Flutter's flutter_3d_controller package and other visual improvements:
Required 3D Models:
assets/3d_models/ folder and add:
delivery_box.obj - For the package visualizationproduct1.obj, product2.obj, product3.obj - Sample productsmap.obj - For the tracking screendelivery_truck.obj - For the delivery vehicleKey 3D Features Added:
Integration Points:
Performance Considerations:
Visibility widgets to unload 3D elements when not visibleTo complete the setup:
flutter pub get to install dependenciesThe 3D elements will make your delivery app more immersive while maintaining all the existing functionality._
Here's the comprehensive database implementation for your Flutter delivery app with Firebase Firestore, including models, services, and security rules:
Firestore Structure:
users collection: Stores user profiles with role-based accessorders collection: Tracks all delivery orders with status historySecurity Rules:
Optimized Queries:
Data Models:
State Management:
firestore.rules)firestore.indexes.json)The database is now set up with:
All database operations are handled through the service classes, making it easy to maintain and test.
Here's the comprehensive implementation for the admin dashboard with analytics and overview features:
Real-time Analytics Dashboard:
Visual Data Representation:
Recent Orders Table:
Performance Optimizations:
Additional Features Ready:
charts_flutter to your pubspec.yamlFor a complete admin panel, you can expand this with:
The dashboard provides admins with immediate visibility into the delivery operations with minimal loading times thanks to Firestore's real-time capabilities._