init function
Implementation
Future<void> init(String projectName, List<String> dependencies) async {
print('🎉 Initializing project: $projectName');
final createResult = await Process.run('flutter', ['create', projectName]);
stdout.write(createResult.stdout);
stderr.write(createResult.stderr);
if (createResult.exitCode != 0) {
print('❌ Failed to create project: $projectName');
return;
}
// Dependencies
final allDependencies = {
'dio',
'google_fonts',
'flutter_dotenv',
'flutter_secure_storage',
'go_router',
...dependencies.map((dep) => dep.split(':').first.trim())
};
final pubAdd = await Process.run(
'flutter',
['pub', 'add', ...allDependencies],
workingDirectory: projectName,
);
stdout.write(pubAdd.stdout);
stderr.write(pubAdd.stderr);
print('📦 Installed dependencies: ${allDependencies.join(', ')}');
print('📦 Added dependencies: ${dependencies.join(', ')}');
final libPath = p.join(projectName, 'lib');
final folders = [
'config/routes',
'config/theme',
'config/env',
'config/storage',
'core/error',
'core/datasources/local',
'core/datasources/remote',
'core/entities',
'core/models',
'core/utils/constants',
'core/usecases',
'features',
];
for (final folder in folders) {
final dir = Directory(p.join(libPath, folder));
if (!dir.existsSync()) {
dir.createSync(recursive: true);
}
}
print('📁 Created required directories in lib');
final mainFile = File(p.join(libPath, 'main.dart'));
mainFile.writeAsStringSync(mainTemplate(projectName));
final testFile = File(p.join(projectName, 'test', 'widget_test.dart'));
testFile.writeAsStringSync(testTemplate(projectName));
print('✅ Updated main.dart with clean architecture entry');
// AppTheme
final themeFile = File(p.join(libPath, 'config/theme/app_theme.dart'));
final primaryColor =
StringUtils.prompt(
'🎨 Enter primary color hex (default: 0xFF2196F3):',
)?.trim();
final colorValue =
primaryColor?.isNotEmpty == true ? primaryColor : '0xFF2196F3';
themeFile.writeAsStringSync(
themeTemplate().replaceAll('{{primaryColor}}', colorValue!),
);
print('🎨 Created app_theme.dart with primary color $colorValue');
final appName = "{{projectName}}";
// env file
final envFile = File(p.join(projectName, '.env'));
envFile.writeAsStringSync(envTemplate());
// config/env/env.config.dart
final envConfigFile = File(p.join(libPath, 'config/env/env.config.dart'));
envConfigFile.writeAsStringSync(envConfigTemplate());
// config/routes/app_routes.dart
final routesFile = File(p.join(libPath, 'config/routes/app_routes.dart'));
routesFile.writeAsStringSync(appRoutesTemplate());
// config/storage/local_storage.dart
final storageFile = File(
p.join(libPath, 'config/storage/local_storage.dart'),
);
storageFile.writeAsStringSync(localStorageTemplate());
// config/routes/navigate.dart
final navigateFile = File(p.join(libPath, 'config/routes/navigate.dart'));
navigateFile.writeAsStringSync(navigateTempalate());
// core/utils/constants/api_endpoints.dart
final apiEndpointsFile = File(
p.join(libPath, 'core/utils/constants/api_endpoints.dart'),
);
apiEndpointsFile.writeAsStringSync(
apiEndPointTemplate().replaceAll(appName, projectName),
);
// core/datasources/remote/api_client.dart
final apiClientFile = File(
p.join(libPath, 'core/datasources/remote/api_client.dart'),
);
apiClientFile.writeAsStringSync(
apiClientTemplate().replaceAll(appName, projectName),
);
// core/entities/api_entity.dart
final apiEntityFile = File(p.join(libPath, 'core/entities/api_entity.dart'));
apiEntityFile.writeAsStringSync(apiEntityTemplate());
// core/models/api_model.dart
final apiModelFile = File(p.join(libPath, 'core/models/api_model.dart'));
apiModelFile.writeAsStringSync(
apiResponseTemplate().replaceAll(appName, projectName),
);
// core/datasources/local/user_token.dart
final userTokenFile = File(
p.join(libPath, 'core/datasources/local/user_token.dart'),
);
userTokenFile.writeAsStringSync(
tokenStorageTemplate().replaceAll(appName, projectName),
);
print(
'🎉 Project "$projectName" initialized successfully with Clean Architecture!',
);
return;
}