addDependencies method
Future<void>
addDependencies(
- String projectName,
- StateManagementType stateManagement,
- bool includeGoRouter,
- bool includeCleanArchitecture,
- bool includeFreezed,
override
Implementation
@override
Future<void> addDependencies(String projectName, StateManagementType stateManagement, bool includeGoRouter, bool includeCleanArchitecture, bool includeFreezed) async {
final pubspecPath = path.join(projectName, 'pubspec.yaml');
final pubspecFile = File(pubspecPath);
if (!pubspecFile.existsSync()) {
throw FileSystemException('pubspec.yaml not found');
}
String pubspecContent = pubspecFile.readAsStringSync();
// Build dependencies list
final dependencies = <String>[];
// Add state management dependencies
switch (stateManagement) {
case StateManagementType.bloc:
dependencies.addAll([
'flutter_bloc: ^9.1.1',
'hydrated_bloc: ^10.1.1',
'replay_bloc: ^0.3.0',
'bloc_concurrency: ^0.3.0',
'dartz: ^0.10.1',
'path_provider: ^2.1.5',
'path: ^1.9.0',
'package_info_plus: ^8.0.0',
'equatable: ^2.0.7',
'get_it: ^8.0.3',
'dio: ^5.7.0',
'flutter_secure_storage: ^9.2.2',
'nested: ^1.0.0',
'pretty_dio_logger: ^1.4.0',
'talker_dio_logger: ^4.4.1',
'talker_flutter: ^4.4.1',
'flutter_form_builder: ^9.4.1',
'form_builder_validators: ^10.0.1',
'drift: ^2.18.0',
'sqlite3_flutter_libs: ^0.5.0',
]);
if (includeFreezed) {
dependencies.addAll([
'json_annotation: ^4.9.0',
'freezed_annotation: ^2.4.4',
]);
}
break;
case StateManagementType.provider:
dependencies.addAll([
'provider: ^6.1.5',
'get_it: ^8.0.3',
]);
// Always add Freezed for non-BLoC state management
dependencies.addAll([
'json_annotation: ^4.9.0',
'freezed_annotation: ^2.4.4',
'freezed: ^2.5.7',
]);
break;
case StateManagementType.none:
// Always add Freezed for non-BLoC state management
dependencies.addAll([
'json_annotation: ^4.9.0',
'freezed_annotation: ^2.4.4',
'freezed: ^2.5.7',
]);
break;
}
// Add Go Router dependency if requested
if (includeGoRouter && !dependencies.any((d) => d.startsWith('go_router:'))) {
dependencies.add('go_router: ^16.0.0');
}
// Always add get_it for dependency injection
if (!dependencies.any((d) => d.startsWith('get_it:'))) {
dependencies.add('get_it: ^8.0.3');
}
// Add Clean Architecture dependencies if requested
if (includeCleanArchitecture) {
if (!dependencies.any((d) => d.startsWith('equatable:'))) {
dependencies.add('equatable: ^2.0.7');
}
}
// Add internationalization dependencies
dependencies.addAll([
'flutter_localizations:',
' sdk: flutter',
'intl: any',
]);
// Build dev dependencies list
final devDependencies = <String>[];
// Always add Freezed dev dependencies for Provider/None or when Freezed is selected
if (includeFreezed || stateManagement == StateManagementType.provider || stateManagement == StateManagementType.none) {
devDependencies.addAll([
'freezed: ^2.5.7',
'json_serializable: ^6.9.0',
'build_runner: ^2.4.13',
]);
}
// Add Drift dev dependencies for BLoC
if (stateManagement == StateManagementType.bloc) {
devDependencies.addAll([
'drift_dev: ^2.18.0',
]);
}
// Add internationalization dev dependencies
devDependencies.addAll([
'intl_utils: ^2.8.7',
]);
final lines = pubspecContent.split('\n');
final newLines = <String>[];
bool skipUntilNextSection = false;
bool dependenciesAdded = false;
bool devDependenciesAdded = false;
for (int i = 0; i < lines.length; i++) {
final line = lines[i];
final trimmedLine = line.trim();
if (trimmedLine == 'dependencies:') {
skipUntilNextSection = true;
if (!dependenciesAdded) {
newLines.add('dependencies:');
for (final dep in dependencies) {
newLines.add(' $dep');
}
newLines.add('');
dependenciesAdded = true;
}
continue;
}
if (trimmedLine == 'dev_dependencies:') {
skipUntilNextSection = true;
if (!devDependenciesAdded) {
newLines.add('dev_dependencies:');
for (final dep in devDependencies) {
newLines.add(' $dep');
}
newLines.add('');
devDependenciesAdded = true;
}
continue;
}
if (skipUntilNextSection) {
if (trimmedLine.isEmpty || trimmedLine.startsWith(' ') || trimmedLine.startsWith(' ') || trimmedLine.startsWith('#')) {
continue;
} else {
skipUntilNextSection = false;
}
}
if (trimmedLine == 'flutter:' && !dependenciesAdded) {
newLines.add('dependencies:');
for (final dep in dependencies) {
newLines.add(' $dep');
}
newLines.add('');
dependenciesAdded = true;
}
if (trimmedLine == 'flutter:' && dependenciesAdded && !devDependenciesAdded) {
newLines.add('dev_dependencies:');
for (final dep in devDependencies) {
newLines.add(' $dep');
}
newLines.add('');
devDependenciesAdded = true;
}
newLines.add(line);
}
if (!dependenciesAdded) {
final flutterIndex = newLines.indexWhere((line) => line.trim() == 'flutter:');
if (flutterIndex != -1) {
newLines.insert(flutterIndex, '');
for (int i = dependencies.length - 1; i >= 0; i--) {
newLines.insert(flutterIndex, ' ${dependencies[i]}');
}
newLines.insert(flutterIndex, 'dependencies:');
dependenciesAdded = true;
}
}
if (!devDependenciesAdded && dependenciesAdded) {
final flutterIndex = newLines.indexWhere((line) => line.trim() == 'flutter:');
if (flutterIndex != -1) {
newLines.insert(flutterIndex, '');
for (int i = devDependencies.length - 1; i >= 0; i--) {
newLines.insert(flutterIndex, ' ${devDependencies[i]}');
}
newLines.insert(flutterIndex, 'dev_dependencies:');
devDependenciesAdded = true;
}
}
pubspecContent = newLines.join('\n');
pubspecFile.writeAsStringSync(pubspecContent);
// Add flutter configuration for internationalization
await _addFlutterConfiguration(projectName);
}