createFeatureFiles function

void createFeatureFiles({
  1. required String projectName,
  2. required String featureName,
  3. required String stateManagement,
})

Implementation

void createFeatureFiles({
  required String projectName,
  required String featureName,
  required String stateManagement,
}) {
  // Screen — sabke liye common
  File(
    '$projectName/lib/features/$featureName/presentation/screens/${featureName}_screen.dart',
  ).writeAsStringSync('''
import 'package:flutter/material.dart';

class ${capitalize(featureName)}Screen extends StatelessWidget {
  const ${capitalize(featureName)}Screen({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('${capitalize(featureName)}'),
      ),
      body: const Center(
        child: Text('${capitalize(featureName)} Screen'),
      ),
    );
  }
}
''');

  // State management ke hisaab se files
  if (stateManagement == 'Bloc') {
    _createBlocFiles(projectName, featureName);
  } else if (stateManagement == 'GetX') {
    _createGetXFiles(projectName, featureName);
  } else if (stateManagement == 'Provider') {
    _createProviderFiles(projectName, featureName);
  } else {
    _createRiverpodFiles(projectName, featureName);
  }

  // Domain + Data — sabke liye common
  File('$projectName/lib/features/$featureName/domain/entities/${featureName}_entity.dart')
      .writeAsStringSync('class ${capitalize(featureName)}Entity {}\n');

  File('$projectName/lib/features/$featureName/domain/repository/${featureName}_repository.dart')
      .writeAsStringSync('abstract class ${capitalize(featureName)}Repository {}\n');

  File('$projectName/lib/features/$featureName/domain/usecases/${featureName}_usecase.dart')
      .writeAsStringSync('''
class ${capitalize(featureName)}UseCase {
  // final ${capitalize(featureName)}Repository repository;
  // ${capitalize(featureName)}UseCase(this.repository);

  Future<void> call() async {
    // TODO: implement use case
  }
}
''');

  File('$projectName/lib/features/$featureName/data/models/${featureName}_model.dart')
      .writeAsStringSync('''
class ${capitalize(featureName)}Model {
  final int id;
  final String name;

  const ${capitalize(featureName)}Model({
    required this.id,
    required this.name,
  });

  factory ${capitalize(featureName)}Model.fromJson(Map<String, dynamic> json) {
    return ${capitalize(featureName)}Model(
      id: json['id'] as int,
      name: json['name'] as String,
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'name': name,
    };
  }

  @override
  String toString() => '${capitalize(featureName)}Model(id: \$id, name: \$name)';
}
''');

  File('$projectName/lib/features/$featureName/data/datasource/${featureName}_remote_datasource.dart')
      .writeAsStringSync('''
import 'package:dio/dio.dart';

class ${capitalize(featureName)}RemoteDataSource {
  final Dio dio;

  ${capitalize(featureName)}RemoteDataSource(this.dio);

  Future<void> fetch${capitalize(featureName)}() async {
    // TODO: implement API call
    // final response = await dio.get('/endpoint');
  }
}
''');

  File('$projectName/lib/features/$featureName/data/repository/${featureName}_repository_impl.dart')
      .writeAsStringSync('''
import '../../domain/repository/${featureName}_repository.dart';

class ${capitalize(featureName)}RepositoryImpl implements ${capitalize(featureName)}Repository {
  // final ${capitalize(featureName)}RemoteDataSource remoteDataSource;
  // ${capitalize(featureName)}RepositoryImpl(this.remoteDataSource);
}
''');

  print('📝 Feature files generated');
}