generate method
Executes the plugin's code-generation and configuration logic.
Implementation
@override
Future<void> generate(ProjectContext context) async {
// Run flutter create
await Services.processService.runFlutterCreate(
projectName: context.projectName,
outputDirectory: context.projectPath,
);
// Clean up default boilerplate main.dart and widget_test.dart
final mainFile = File('${context.projectPath}/lib/main.dart');
if (mainFile.existsSync()) {
mainFile.deleteSync();
}
final testFile = File('${context.projectPath}/test/widget_test.dart');
if (testFile.existsSync()) {
testFile.deleteSync();
}
// Create assets directories in project root
Services.fileService.createDir('${context.projectPath}/assets/icons');
Services.fileService.createDir('${context.projectPath}/assets/images');
// Register assets and .env in pubspec.yaml
final pubspecPath = '${context.projectPath}/pubspec.yaml';
Services.yamlService.addAssets(pubspecPath, [
'assets/icons/',
'assets/images/',
'.env',
]);
// Write .env file to project root
final envContent = 'API_URL=${context.backendUrl ?? 'https://api.example.com'}\n';
Services.fileService.writeFile('${context.projectPath}/.env', envContent);
// Add flutter_dotenv to dependencies
Services.yamlService.addDependency(pubspecPath, 'flutter_dotenv', '^5.1.0');
// Append .env to gitignore
final gitignoreFile = File('${context.projectPath}/.gitignore');
if (gitignoreFile.existsSync()) {
var content = gitignoreFile.readAsStringSync();
if (!content.contains('.env')) {
content += '\n# Environments\n.env\n';
gitignoreFile.writeAsStringSync(content);
}
}
// Write config file to project root
final configContent = '''{
"projectName": "${context.projectName}",
"architecture": "${context.architecture.name}",
"stateManagement": "${context.stateManagement.name}",
"routing": "${context.routing.name}",
"theme": "${context.theme.name}"
}
''';
Services.fileService.writeFile('${context.projectPath}/.flutter_init_cli.json', configContent);
}