initializeProject function
Future<void>
initializeProject(
)
Implementation
Future<void> initializeProject() async {
try {
var currentDir = Directory.current;
var projectName = currentDir.path.split(Platform.pathSeparator).last;
// Set up directory structure
final directories = [
'lib/features/auth/domain/models',
'lib/features/auth/domain/repository',
'lib/features/auth/domain/services',
'lib/features/auth/logic',
'lib/features/auth/screens',
'lib/features/auth/widgets',
'lib/features/splash/screens',
'lib/shared/api/network/models',
'lib/shared/api/endpoint',
'lib/shared/app/enums',
'lib/shared/app/extension',
'lib/shared/app/list',
'lib/shared/constants',
'lib/shared/models',
'lib/shared/routes',
'lib/shared/themes',
'lib/shared/utils/flavour',
'lib/shared/utils/auth',
'lib/shared/utils/bloc_observer',
'lib/shared/utils/failures',
'lib/shared/widgets'
];
for (var dir in directories) {
await Directory(dir).create(recursive: true);
}
// Create files with content
// Create files with content
final files = {
'lib/main.dart':
"import 'package:flutter/material.dart';\nimport 'package:$projectName/my_app.dart';\n\nvoid main() {\n runApp(MyApp());\n}\n",
'lib/my_app.dart':
"import 'package:flutter/material.dart';\n\nclass MyApp extends StatelessWidget {\n const MyApp({super.key});\n\n @override\n Widget build(BuildContext context) {\n return MaterialApp(\n title: 'Flutter Demo',\n theme: ThemeData(\n primarySwatch: Colors.blue,\n ),\n home: const HomeScreen(),\n );\n }\n}\n\nclass HomeScreen extends StatelessWidget {\n const HomeScreen({super.key});\n\n @override\n Widget build(BuildContext context) {\n return Scaffold(\n appBar: AppBar(\n title: const Text('Home Screen'),\n ),\n body: const Center(\n child: Text('Welcome to your Flutter app!'),\n ),\n );\n }\n}\n",
'lib/shared/api/endpoint/api_endpoints.dart':
"class ApiEndpoints {\n static const String myEndpoint1 = '/endpoint1';\n static const String myEndpoint2 = '/endpoint2';\n}\n",
'lib/shared/api/network/models/response.dart':
"class ResponseData {\n final int? statusCode;\n final bool? success;\n final String? message;\n\n ResponseData({\n this.statusCode,\n this.success = false,\n this.message,\n });\n}\n",
'lib/features/splash/screens/splash_screen.dart': '''
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:$projectName/shared/app/extension/helper.dart';
class SplashScreen extends StatefulWidget {
const SplashScreen({super.key});
@override
State<SplashScreen> createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> {
@override
void initState() {
super.initState();
Helper.afterInit(_initialFunction);
}
void _initialFunction() {
final currentContext = context;
// Future.delayed(const Duration(seconds: 1), () async {
// // await AuthUtils.instance.deleteTokens; //test purpose to delete tokens
// if (!currentContext.mounted) return;
// final bool status = await AuthUtils.instance.isSignedIn;
// if (!currentContext.mounted) return;
// if (status) {
// Navigator.pushNamedAndRemoveUntil(
// currentContext, routeMain, ModalRoute.withName(routeRoot));
// } else {
// Navigator.pushNamedAndRemoveUntil(
// currentContext, routeLogin, ModalRoute.withName(routeRoot));
// }
// });
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: Center(
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 10.w),
child: FlutterLogo(
size: 164.w,
),
),
),
);
}
}
''',
'lib/shared/api/network/network.dart': '''
import 'dart:async';
import 'dart:convert';
import 'package:dio/dio.dart';
class NetworkProvider {
final Dio _dio;
NetworkProvider()
: _dio = Dio(BaseOptions(
baseUrl: 'https://api.example.com',
headers: {'Content-Type': 'application/json'},
)) {
_dio.interceptors.add(InterceptorsWrapper(
onRequest: (options, handler) async {
print('------------------------------------------');
String fullUrl = options.baseUrl + options.path;
print('Full URL: \$fullUrl');
print('Request = \${jsonEncode(options.data)}');
print('------------------------------------------');
if (options.headers.containsKey('auth')) {
options.headers.remove('auth');
} else {
// Implement your logic for adding Authorization header
}
return handler.next(options);
},
onResponse: (response, handler) {
print('******************************************');
print('Response = \${response.data.toString()}');
print('******************************************');
return handler.next(response);
},
onError: (error, handler) async {
print('Error-Response [\${error.response?.statusCode}] = \${error.response?.toString()}');
// Handle error cases and retries
},
));
}
Future<Response<T>> get<T>(String path) async {
try {
return await _dio.get<T>(path);
} catch (error) {
return Future.error(error);
}
}
// Add other methods (post, put, delete, etc.) here
}
''',
'lib/shared/app/enums/api_fetch_status.dart':
"enum ApiFetchStatus {\n idle,\n loading,\n success,\n failed,\n}\n",
'lib/shared/app/extension/helper.dart':
"import 'dart:async';\nimport 'package:flutter/cupertino.dart';\n\nclass Helper {\n static void afterInit(Function function) {\n WidgetsBinding.instance.addPostFrameCallback((_) {\n function();\n });\n }\n}\n",
'lib/shared/routes/navigator.dart':
"import 'package:flutter/material.dart';\nfinal GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();",
'lib/shared/routes/route_generator.dart':
"import 'package:flutter/material.dart';\nimport 'package:$projectName/features/splash/screens/splash_screen.dart';\nimport 'package:$projectName/my_app.dart';\n\nclass RouteGenerator {\n static Route<dynamic> generateRoute(RouteSettings settings) {\n switch (settings.name) {\n case '/':\n return MaterialPageRoute(builder: (_) => SplashScreen());\n case '/login':\n return MaterialPageRoute(builder: (_) => SplashScreen());\n default:\n return MaterialPageRoute(\n builder: (_) => Scaffold(\n body: Center(child: Text('No route defined for \${settings.name}')),\n ),\n );\n }\n }\n}\n",
'lib/shared/routes/routes.dart':
"import 'package:flutter/material.dart';\nimport 'package:$projectName/shared/routes/navigator.dart';\nimport 'package:$projectName/shared/routes/route_generator.dart';\n\nclass Routes {\n static const String home = '/';\n static const String login = '/login';\n}\n",
'lib/shared/widgets/flavor_banner.dart':
"import 'package:flutter/material.dart';\n\nclass FlavorBanner extends StatelessWidget {\n const FlavorBanner({\n required this.child,\n required this.message,\n this.show = true,\n super.key,\n });\n final Widget child;\n final bool show;\n final String message;\n @override\n Widget build(BuildContext context) => show\n ? Directionality(\n textDirection: TextDirection.ltr,\n child: Banner(\n location: BannerLocation.topStart,\n message: message,\n color: Colors.green.withOpacity(0.6),\n textStyle: const TextStyle(\n fontWeight: FontWeight.w700,\n fontSize: 12.0,\n letterSpacing: 1.0),\n textDirection: TextDirection.ltr,\n child: child,\n ),\n )\n : child;\n}\n",
};
for (var path in files.keys) {
await File(path).writeAsString(files[path]!);
}
print('Directory and file setup is complete for $projectName!');
} catch (e) {
print('Error: $e');
}
}