🏛️ Flutter Folder Gen CLI
A powerful Dart CLI tool that generates complete, production-ready Flutter project structures for your chosen architecture pattern in seconds.
✨ Supported Patterns
| Pattern | Description | Key packages |
|---|---|---|
| MVC | Model-View-Controller | http, shared_preferences |
| BLoC | Business Logic Component | flutter_bloc, equatable |
| GetX | GetX state management | get, get_storage |
| Provider | Provider + GoRouter | provider, go_router |
| MVVM | Features-First Clean Architecture | flutter_riverpod, go_router, freezed |
🚀 Installation
Option 1 — Global activation (pub.dev)
dart pub global activate flutter_folder_gen
Option 2 — From source
git clone https://github.com/yourname/flutter_folder_gen
cd flutter_folder_gen
dart pub global activate --source path .
📖 Usage
Interactive mode (recommended for first-timers)
flutter_folder_gen --interactive
# or simply:
flutter_folder_gen
Direct flags
# Generate a BLoC project
flutter_folder_gen -p bloc -n my_app
# Generate a GetX project in a specific folder
flutter_folder_gen -p getx -n shop_app -o ./projects
# Generate an MVC project
flutter_folder_gen -p mvc -n todo_app
# Generate a Provider project
flutter_folder_gen -p provider -n weather_app
# Generate an MVVM (Features-First) project
flutter_folder_gen -p mvvm -n my_clean_app
All options
-p, --pattern Architecture pattern: mvc | bloc | getx | provider | mvvm
-n, --name Project/feature name (snake_case, e.g. my_app)
-o, --output Output directory (default: current directory)
-i, --interactive Run guided interactive setup
-h, --help Show help
-v, --version Show version
📁 Generated Structures
MVC
my_app/
├── lib/
│ ├── core/
│ │ ├── constants/app_constants.dart
│ │ ├── network/api_service.dart
│ │ ├── storage/local_storage.dart
│ │ ├── theme/app_theme.dart
│ │ └── utils/
│ │ ├── extensions.dart
│ │ └── validators.dart
│ ├── models/
│ │ └── user_model.dart
│ ├── views/
│ │ ├── home/
│ │ │ ├── home_view.dart
│ │ │ └── widgets/home_card.dart
│ │ ├── auth/login_view.dart
│ │ └── splash/splash_view.dart
│ ├── controllers/
│ │ ├── base_controller.dart
│ │ ├── home_controller.dart
│ │ └── auth_controller.dart
│ ├── repositories/
│ │ ├── base_repository.dart
│ │ └── user_repository.dart
│ ├── routes/app_routes.dart
│ └── main.dart
├── test/
│ ├── controllers/home_controller_test.dart
│ └── models/user_model_test.dart
├── assets/
│ ├── images/
│ └── icons/
├── pubspec.yaml
├── analysis_options.yaml
└── .gitignore
BLoC (Clean Architecture)
my_app/
├── lib/
│ ├── core/
│ │ ├── constants/
│ │ ├── error/failures.dart
│ │ ├── network/api_service.dart
│ │ ├── theme/
│ │ ├── usecase/usecase.dart
│ │ └── utils/either.dart
│ ├── data/
│ │ ├── datasources/
│ │ │ ├── user_remote_datasource.dart
│ │ │ └── user_local_datasource.dart
│ │ ├── models/user_model.dart
│ │ └── repositories/user_repository_impl.dart
│ ├── domain/
│ │ ├── entities/user_entity.dart
│ │ ├── repositories/user_repository.dart ← abstract
│ │ └── usecases/get_users_usecase.dart
│ ├── presentation/
│ │ ├── home/
│ │ │ ├── bloc/ (home_bloc, home_event, home_state)
│ │ │ ├── pages/home_page.dart
│ │ │ └── widgets/user_list_tile.dart
│ │ └── auth/
│ │ ├── bloc/ (auth_bloc, auth_event, auth_state)
│ │ └── pages/login_page.dart
│ ├── injection_container.dart
│ ├── routes/app_router.dart
│ └── main.dart
└── test/
├── blocs/home_bloc_test.dart
└── usecases/get_users_usecase_test.dart
GetX
my_app/
├── lib/
│ ├── core/
│ │ ├── constants/
│ │ ├── network/
│ │ ├── storage/storage_service.dart
│ │ ├── theme/
│ │ └── utils/snackbar_utils.dart
│ ├── data/
│ │ ├── models/user_model.dart
│ │ ├── providers/user_provider.dart
│ │ └── repositories/user_repository.dart
│ ├── modules/
│ │ ├── home/
│ │ │ ├── bindings/home_binding.dart
│ │ │ ├── controllers/home_controller.dart
│ │ │ └── views/
│ │ │ ├── home_view.dart
│ │ │ └── widgets/user_card.dart
│ │ ├── auth/
│ │ │ ├── bindings/auth_binding.dart
│ │ │ ├── controllers/auth_controller.dart
│ │ │ └── views/login_view.dart
│ │ └── splash/
│ │ ├── bindings/splash_binding.dart
│ │ ├── controllers/splash_controller.dart
│ │ └── views/splash_view.dart
│ ├── routes/
│ │ ├── app_pages.dart
│ │ └── app_routes.dart
│ └── main.dart
Provider
my_app/
├── lib/
│ ├── core/
│ │ ├── constants/
│ │ ├── network/
│ │ ├── storage/prefs_service.dart
│ │ ├── theme/
│ │ └── utils/extensions.dart
│ ├── models/user_model.dart
│ ├── providers/
│ │ ├── auth_provider.dart
│ │ ├── theme_provider.dart
│ │ └── user_provider.dart
│ ├── repositories/user_repository.dart
│ ├── router/app_router.dart ← GoRouter with auth redirect
│ ├── screens/
│ │ ├── home/
│ │ │ ├── home_screen.dart
│ │ │ └── widgets/user_list_item.dart
│ │ ├── auth/login_screen.dart
│ │ └── splash/splash_screen.dart
│ ├── app.dart ← MultiProvider root
│ └── main.dart
└── test/
└── providers/user_provider_test.dart
MVVM + Features First Clean Architecture
my_app/
├── lib/
│ ├── core/
│ │ ├── constants/ ← AppConstants, ApiEndpoints
│ │ ├── error/ ← Failures, Exceptions
│ │ ├── network/ ← ApiClient, NetworkInfo
│ │ ├── providers/ ← CoreProviders (Riverpod)
│ │ ├── router/ ← GoRouter with auth redirect
│ │ ├── storage/ ← StorageService
│ │ ├── theme/ ← AppTheme, AppColors, AppTextStyles
│ │ ├── usecase/ ← UseCase base classes
│ │ ├── utils/ ← Either, Extensions, Validators
│ │ └── viewmodel/ ← BaseViewModel
│ └── features/
│ ├── auth/
│ │ ├── data/ ← Models, DataSources, RepoImpl
│ │ ├── domain/ ← Entities, Repository, UseCases
│ │ ├── presentation/← ViewModel, Pages, Widgets
│ │ └── providers/ ← Riverpod providers
│ └── home/
│ ├── data/
│ ├── domain/
│ ├── presentation/
│ └── providers/
└── test/
└── features/
├── auth/ ← ViewModel & UseCase tests
└── home/ ← ViewModel tests
🔧 After Generation
cd my_app
flutter pub get
flutter run
📄 License
MIT