I'll create a comprehensive Flutter delivery app with all the requested features. Here's the project structure and initial setup:
<jitProject id="delivery-app" title="Delivery App with Clean Architecture">
<jitFile type="file" filePath="lib/main.dart">
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:provider/provider.dart';
import 'app.dart';
import 'firebase_options.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => AuthProvider()),
ChangeNotifierProvider(create: (_) => UserProvider()),
ChangeNotifierProvider(create: (_) => OrderProvider()),
],
child: const MyApp(),
),
);
}
</jitFile>
<jitFile type="file" filePath="lib/app.dart">
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'providers/auth_provider.dart';
import 'screens/auth/login_screen.dart';
import 'screens/auth/signup_screen.dart';
import 'screens/user/home_screen.dart';
import 'screens/admin/admin_dashboard.dart';
import 'screens/splash_screen.dart';
class MyApp extends StatelessWidget {
const MyApp({super.key});
@env
Widget build(BuildContext context) {
return MaterialApp(
title: 'Delivery App',
theme: ThemeData(
colorScheme: ColorScheme.light(
primary: Colors.blue.shade800,
secondary: Colors.blue.shade600,
),
fontFamily: 'Roboto',
),
darkTheme: ThemeData.dark().copyWith(
colorScheme: ColorScheme.dark(
primary: Colors.blue.shade300,
secondary: Colors.blue.shade200,
),
),
themeMode: Provider.of<ThemeProvider>(context).themeMode,
debugShowCheckedModeBanner: false,
home: const SplashScreen(),
routes: {
'/login': (context) => const LoginScreen(),
'/signup': (context) => const SignupScreen(),
'/home': (context) => const HomeScreen(),
'/admin': (context) => const AdminDashboard(),
},
);
}
}
</jitFile>
<jitFile type="file" filePath="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> data) {
return UserModel(
uid: data['uid'] ?? '',
email: data['email'] ?? '',
name: data['name'] ?? '',
role: data['role'] ?? 'user',
createdAt: data['createdAt'].toDate(),
);
}
Map<String, dynamic> toMap() {
return {
'uid': uid,
'email': email,
'name': name,
'role': role,
'createdAt': createdAt,
};
}
}
</jitFile>
<jitFile type="file" filePath="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> data) {
return OrderModel(
id: data['id'] ?? '',
userId: data['userId'] ?? '',
items: List<Map<String, dynamic>>.from(data['items'] ?? []),
totalPrice: (data['totalPrice'] ?? 0).toDouble(),
status: data['status'] ?? 'pending',
createdAt: data['createdAt'].toDate(),
deliveryAddress: data['deliveryAddress'] ?? '',
);
}
Map<String, dynamic> toMap() {
return {
'id': id,
'userId': userId,
'items': items,
'totalPrice': totalPrice,
'status': status,
'createdAt': createdAt,
'deliveryAddress': deliveryAddress,
};
}
}
</jitFile>
<jitFile type="file" filePath="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 {
final FirebaseAuth _auth = FirebaseAuth.instance;
final FirebaseFirestore _firestore = FirebaseFirestore.instance;
UserModel? _user;
UserModel? get user => _user;
Future<void> signInWithEmailAndPassword(
String email,
String password,
) async {
try {
UserCredential userCredential = await _auth.signInWithEmailAndPassword(
email: email,
password: password,
);
await _fetchUserData(userCredential.user!.uid);
} catch (e) {
rethrow;
}
}
Future<void> signUpWithEmailAndPassword(
String email,
String password,
String name,
String role,
) async {
try {
UserCredential userCredential = await _auth.createUserWithEmailAndPassword(
email: email,
password: password,
);
_user = UserModel(
uid: userCredential.user!.uid,
email: email,
name: name,
role: role,
createdAt: DateTime.now(),
<jitProject id="delivery-app" title="Delivery App with Clean Architecture">
<jitFile type="file" filePath="lib/main.dart">
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:provider/provider.dart';
import 'app.dart';
import 'firebase_options.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => AuthProvider()),
ChangeNotifierProvider(create: (_) => UserProvider()),
ChangeNotifierProvider(create: (_) => OrderProvider()),
],
child: const MyApp(),
),
);
}
</jitFile>
<jitFile type="file" filePath="lib/app.dart">
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'providers/auth_provider.dart';
import 'screens/auth/login_screen.dart';
import 'screens/auth/signup_screen.dart';
import 'screens/user/home_screen.dart';
import 'screens/admin/admin_dashboard.dart';
import 'screens/splash_screen.dart';
class MyApp extends StatelessWidget {
const MyApp({super.key});
@env
Widget build(BuildContext context) {
return MaterialApp(
title: 'Delivery App',
theme: ThemeData(
colorScheme: ColorScheme.light(
primary: Colors.blue.shade800,
secondary: Colors.blue.shade600,
),
fontFamily: 'Roboto',
),
darkTheme: ThemeData.dark().copyWith(
colorScheme: ColorScheme.dark(
primary: Colors.blue.shade300,
secondary: Colors.blue.shade200,
),
),
themeMode: Provider.of<ThemeProvider>(context).themeMode,
debugShowCheckedModeBanner: false,
home: const SplashScreen(),
routes: {
'/login': (context) => const LoginScreen(),
'/signup': (context) => const SignupScreen(),
'/home': (context) => const HomeScreen(),
'/admin': (context) => const AdminDashboard(),
},
);
}
}
</jitFile>
<jitFile type="file" filePath="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> data) {
return UserModel(
uid: data['uid'] ?? '',
email: data['email'] ?? '',
name: data['name'] ?? '',
role: data['role'] ?? 'user',
createdAt: data['createdAt'].toDate(),
);
}
Map<String, dynamic> toMap() {
return {
'uid': uid,
'email': email,
'name': name,
'role': role,
'createdAt': createdAt,
};
}
}
</jitFile>
<jitFile type="file" filePath="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> data) {
return OrderModel(
id: data['id'] ?? '',
userId: data['userId'] ?? '',
items: List<Map<String, dynamic>>.from(data['items'] ?? []),
totalPrice: (data['totalPrice'] ?? 0).toDouble(),
status: data['status'] ?? 'pending',
createdAt: data['createdAt'].toDate(),
deliveryAddress: data['deliveryAddress'] ?? '',
);
}
Map<String, dynamic> toMap() {
return {
'id': id,
'userId': userId,
'items': items,
'totalPrice': totalPrice,
'status': status,
'createdAt': createdAt,
'deliveryAddress': deliveryAddress,
};
}
}
</jitFile>
<jitFile type="file" filePath="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 {
final FirebaseAuth _auth = FirebaseAuth.instance;
final FirebaseFirestore _firestore = FirebaseFirestore.instance;
UserModel? _user;
UserModel? get user => _user;
Future<void> signInWithEmailAndPassword(
String email,
String password,
) async {
try {
UserCredential userCredential = await _auth.signInWithEmailAndPassword(
email: email,
password: password,
);
await _fetchUserData(userCredential.user!.uid);
} catch (e) {
rethrow;
}
}
Future<void> signUpWithEmailAndPassword(
String email,
String password,
String name,
String role,
) async {
try {
UserCredential userCredential = await _auth.createUserWithEmailAndPassword(
email: email,
password: password,
);
_user = UserModel(
uid: userCredential.user!.uid,
email: email,
name: name,
role: role,
createdAt: DateTime.now(),
I'll create a comprehensive Flutter delivery app with all the requested features. Here's the project structure and initial setup:
<jitProject id="delivery-app" title="Delivery App with Clean Architecture">
<jitFile type="file" filePath="lib/main.dart">
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:provider/provider.dart';
import 'app.dart';
import 'firebase_options.dart';
void main() async {
WidgetsFlutterBinding.ensureIn
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => AuthProvider()),
ChangeNotifierProvider(create: (_) => UserProvider()),
ChangeNotifierProvider(create: (_) => OrderProvider()),
],
child: const MyApp(),
),
);
}
</jitFile>
<jitFile type="file" filePath="lib/app.dart">
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'providers/auth_provider.dart';
import 'screens/auth/login_screen.dart';
import 'screens/auth/signup_screen.dart';
import 'screens/user/home_screen.dart';
import 'screens/admin/admin_dashboard.dart';
import 'screens/splash_screen.dart';
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Delivery App',
theme: ThemeData(
colorScheme: ColorScheme.light(
primary: Colors.blue.shade800,
secondary: Colors.blue.shade600,
),
fontFamily: 'Roboto',
),
darkTheme: ThemeData.dark().copyWith(
colorScheme: ColorScheme.dark(
primary: Colors.blue.shade300,
secondary: Colors.blue.shade200,
),
),
themeMode: Provider.of<ThemeProvider>(context).themeMode,
debugShowCheckedModeBanner: false,
home: const SplashScreen(),
routes: {
'/login': (context) => const LoginScreen(),
'/signup': (context) => the SignupScreen(),
'/home': (context) => const HomeScreen(),
'/admin': (context) => const AdminDashboard(),
},
);
}
}
</jitFile>
<jitFile type="file" filePath="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> data) {
return UserModel(
uid: data['uid'] ?? '',
email: data['email'] ?? '',
name: data['name'] ?? '',
role: data['role'] ?? 'user',
createdAt: data['createdAt'].toDate(),
);
}
Map<String, dynamic> toMap() {
return {
'uid': uid,
'email': email,
'name': name,
'role': role,
'createdAt': createdAt,
};
}
}
</jitFile>
<jitFile type="file" filePath="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> data) {
return OrderModel(
id: data['id'] ?? '',
userId: data['userId'] ?? '',
items: List<Map<String, dynamic>>.from(data['items'] ?? []),
totalPrice: (data['totalPrice'] ?? 0).toDouble(),
status: data['status'] ?? 'pending',
createdAt: data['createdAt'].toDate(),
deliveryAddress: data['deliveryAddress'] ?? '',
);
}
Map<String, dynamic> toMap() {
return {
'id': id,
'userId': userId,
'items': items,
'totalPrice': totalPrice,
'status': status,
'createdAt': createdAt,
'deliveryAddress': deliveryAddress,
};
}
}
</jitFile>
<jitFile type="file" filePath="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 {
final FirebaseAuth _auth = FirebaseAuth.instance;
final FirebaseFirestore _firestore = FirebaseFirestore.instance;
UserModel? _user;
UserModel? get user => _user;
Future<void> signInWithEmailAndPassword(
String email,
String password,
) async {
try {
UserCredential userCredential = await _auth.signInWithEmailAndPassword(
email: email,
password: password,
);
await _fetchUserData(userCredential.user!.
<jitProject id="delivery-app" title="Delivery App with Clean Architecture">
<jitFile type="file" filePath="lib/main.dart">
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:provider/provider.dart';
import 'app.dart';
import 'firebase_options.dart';
void main() async {
WidgetsFlutterBinding.ensureIn
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => AuthProvider()),
ChangeNotifierProvider(create: (_) => UserProvider()),
ChangeNotifierProvider(create: (_) => OrderProvider()),
],
child: const MyApp(),
),
);
}
</jitFile>
<jitFile type="file" filePath="lib/app.dart">
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'providers/auth_provider.dart';
import 'screens/auth/login_screen.dart';
import 'screens/auth/signup_screen.dart';
import 'screens/user/home_screen.dart';
import 'screens/admin/admin_dashboard.dart';
import 'screens/splash_screen.dart';
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Delivery App',
theme: ThemeData(
colorScheme: ColorScheme.light(
primary: Colors.blue.shade800,
secondary: Colors.blue.shade600,
),
fontFamily: 'Roboto',
),
darkTheme: ThemeData.dark().copyWith(
colorScheme: ColorScheme.dark(
primary: Colors.blue.shade300,
secondary: Colors.blue.shade200,
),
),
themeMode: Provider.of<ThemeProvider>(context).themeMode,
debugShowCheckedModeBanner: false,
home: const SplashScreen(),
routes: {
'/login': (context) => const LoginScreen(),
'/signup': (context) => the SignupScreen(),
'/home': (context) => const HomeScreen(),
'/admin': (context) => const AdminDashboard(),
},
);
}
}
</jitFile>
<jitFile type="file" filePath="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> data) {
return UserModel(
uid: data['uid'] ?? '',
email: data['email'] ?? '',
name: data['name'] ?? '',
role: data['role'] ?? 'user',
createdAt: data['createdAt'].toDate(),
);
}
Map<String, dynamic> toMap() {
return {
'uid': uid,
'email': email,
'name': name,
'role': role,
'createdAt': createdAt,
};
}
}
</jitFile>
<jitFile type="file" filePath="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> data) {
return OrderModel(
id: data['id'] ?? '',
userId: data['userId'] ?? '',
items: List<Map<String, dynamic>>.from(data['items'] ?? []),
totalPrice: (data['totalPrice'] ?? 0).toDouble(),
status: data['status'] ?? 'pending',
createdAt: data['createdAt'].toDate(),
deliveryAddress: data['deliveryAddress'] ?? '',
);
}
Map<String, dynamic> toMap() {
return {
'id': id,
'userId': userId,
'items': items,
'totalPrice': totalPrice,
'status': status,
'createdAt': createdAt,
'deliveryAddress': deliveryAddress,
};
}
}
</jitFile>
<jitFile type="file" filePath="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 {
final FirebaseAuth _auth = FirebaseAuth.instance;
final FirebaseFirestore _firestore = FirebaseFirestore.instance;
UserModel? _user;
UserModel? get user => _user;
Future<void> signInWithEmailAndPassword(
String email,
String password,
) async {
try {
UserCredential userCredential = await _auth.signInWithEmailAndPassword(
email: email,
password: password,
);
await _fetchUserData(userCredential.user!.