Flutter Architecture & Architect CLI (Plugin)
A production-grade command-line tool and developer plugin designed to architect, generate, and scale clean architecture codebases in Flutter. It eliminates repetitive setup, enforcing a modular, highly scalable, and team-friendly project structure with your choice of 19 state management architectures:
- Native & Zero-Dependency: ValueNotifier (Pure Flutter ListenableBuilder) & InheritedWidget (Pure Flutter InheritedNotifier).
- Modern Reactive & Functional: Riverpod (Modern Reactive StateNotifier), Signals (Fine-grained Reactivity), Flutter Hooks (HookWidget & useState), MobX (Observable & Action), & RxDart + Provider (Stream-driven).
- BLoC Family: flutter_bloc (Event & State-driven), Cubit (Method-driven BLoC), & Hydrated BLoC (Auto-persisted state to disk).
- MVVM & MVC: Elementary (MVVM - WidgetModel & ElementaryModel), Flutter Command (Command & CommandBuilder), StateX (MVC - StateXController & StateX), & Pure Provider (ChangeNotifier & Consumer).
- Redux Family: Redux (Central Store & Reducer), Fish-Redux (Page, Effect, Reducer & Component architecture), & Binder (Scoped StateRef & Logic).
- Reactive Micro-framework: GetX (Reactive Controller & Bindings), & Triple (Segmented State Pattern - Store & ScopedBuilder).
Tip
Read the complete setup and detailed architectural guide on Medium: Stop Writing Boilerplate: Scaffold a Flutter Clean Architecture App in 60 Seconds!
Table of Contents
- Installation and Setup
- Complete Command Cheat Sheet (Standard Flutter)
- FVM (Flutter Version Management) Support
- Features
- Folder Structure
- State Management Isolation
- Usage Guide
- 1. create: Scaffold a New Clean Architecture App
- 2. create_feature: Generate a Complete Feature Layer
- 3. create_screen: Add a Presentation Screen
- 4. create_model: Generate UI Entity and Response DTO
- 5. create_datasource: Generate an API Data Source
- 6. create_repository: Generate a Repository
- 7. create_service: Generate a Core Singleton Service
- 8. change_bundle_id: Rename Package Name and Bundle ID
- Architecture Flow
- Form Validation Helper
- Roadmap and Future Goals
- Contributing
- Support and Donations
Installation and Setup
You can use flutter_architecture_cli in two convenient ways:
Method 1: Project Dev Dependency (Recommended)
This method ensures everyone on your team has access to the CLI with matching versions, without requiring machine-wide global installations.
A. New Projects Created via the CLI
When you scaffold an application using flutter_architecture_cli create <app_name>, the tool
automatically adds flutter_architecture_cli to your dev_dependencies inside pubspec.yaml!
You can immediately navigate into your project folder and run commands:
# Standard Flutter
dart run flutter_architecture_cli <command>
# Or with FVM
fvm dart run flutter_architecture_cli <command>
B. Adding to Existing Projects
To add the CLI to an existing Flutter codebase:
# Standard Flutter
flutter pub add --dev flutter_architecture_cli
# Or with FVM
fvm flutter pub add --dev flutter_architecture_cli
Once installed, run any command from your project root:
dart run flutter_architecture_cli <command>
# (or with FVM: fvm dart run flutter_architecture_cli <command>)
Method 2: Global Installation
If you prefer having the CLI globally accessible from any terminal window without prefixing
dart run:
Standard Flutter:
dart pub global activate flutter_architecture_cli
With FVM:
fvm dart pub global activate flutter_architecture_cli
Note: Make sure your global pub cache bin directory is in your system's
PATH:
- macOS/Linux:
export PATH="$PATH":"$HOME/.pub-cache/bin"- Windows:
%USERPROFILE%\AppData\Local\Pub\Cache\bin
Once activated globally, execute commands directly:
flutter_architecture_cli <command>
Method 3: Local Path Installation (Development)
If you are developing the CLI locally, testing new features, or working on unreleased versions without waiting for a pub.dev release:
# Link your local working copy globally:
dart pub global activate --source path /path/to/flutter_architecture_cli
# Or with FVM:
fvm dart pub global activate --source path /path/to/flutter_architecture_cli
Once activated, flutter_architecture_cli will execute your local source code directly from any
terminal window across your system.
Complete Command Cheat Sheet (Standard Flutter)
Whether you run commands via Global Installation (flutter_architecture_cli <cmd>) or as a
Project Dev Dependency (dart run flutter_architecture_cli <cmd>), here is the complete
quick-reference cheat sheet for everything the plugin can do:
1. Overview of All 8 CLI Commands
| Command | Purpose | Global CLI Example | Project Dev-Dependency Example |
|---|---|---|---|
create |
Scaffold a complete Clean Architecture project (19 state options) | flutter_architecture_cli create my_app --riverpod |
dart run flutter_architecture_cli create my_app --riverpod |
create_feature |
Generate complete feature (data, domain, presentation, state) | flutter_architecture_cli create_feature cart |
dart run flutter_architecture_cli create_feature cart |
create_screen |
Add a new UI screen widget to a feature | flutter_architecture_cli create_screen home -f auth |
dart run flutter_architecture_cli create_screen home -f auth |
create_model |
Generate domain UI Entity + JSON Response DTO pair | flutter_architecture_cli create_model item -f cart |
dart run flutter_architecture_cli create_model item -f cart |
create_datasource |
Generate remote API DataSource with ApiClient singleton |
flutter_architecture_cli create_datasource cart -f cart |
dart run flutter_architecture_cli create_datasource cart -f cart |
create_repository |
Generate Repository bridging DataSource & state layer | flutter_architecture_cli create_repository cart -f cart |
dart run flutter_architecture_cli create_repository cart -f cart |
create_service |
Generate thread-safe core singleton service in lib/core/ |
flutter_architecture_cli create_service analytics |
dart run flutter_architecture_cli create_service analytics |
change_bundle_id |
Safely rename Android package ID, Gradle, and iOS Bundle ID | flutter_architecture_cli change_bundle_id com.my.app |
dart run flutter_architecture_cli change_bundle_id com.my.app |
2. Project Scaffolding Cheat Sheet (All 19 Architectures)
| State Architecture | Global CLI Command | Dev-Dependency Command (dart run) |
External Dependencies |
|---|---|---|---|
| Interactive Selection | flutter_architecture_cli create my_app |
dart run flutter_architecture_cli create my_app |
Prompts menu [1] to [19] |
| ValueNotifier | flutter_architecture_cli create my_app --valuenotifier |
dart run flutter_architecture_cli create my_app --valuenotifier |
(Zero Dependencies - Pure Flutter) |
| InheritedWidget | flutter_architecture_cli create my_app --inheritedwidget |
dart run flutter_architecture_cli create my_app --inheritedwidget |
(Zero Dependencies - Pure Flutter) |
| Flutter Hooks | flutter_architecture_cli create my_app --hooks |
dart run flutter_architecture_cli create my_app --hooks |
flutter_hooks: ^0.20.5 |
| Triple | flutter_architecture_cli create my_app --triple |
dart run flutter_architecture_cli create my_app --triple |
flutter_triple: ^3.0.0 |
| Elementary | flutter_architecture_cli create my_app --elementary |
dart run flutter_architecture_cli create my_app --elementary |
elementary: ^3.2.1, elementary_helper: ^1.1.0 |
| Hydrated BLoC | flutter_architecture_cli create my_app --hydrated_bloc |
dart run flutter_architecture_cli create my_app --hydrated_bloc |
hydrated_bloc: ^9.1.5, flutter_bloc: ^8.1.6, path_provider |
| StateX | flutter_architecture_cli create my_app --statex |
dart run flutter_architecture_cli create my_app --statex |
state_extended: ^7.6.0 |
| Flutter Command | flutter_architecture_cli create my_app --command |
dart run flutter_architecture_cli create my_app --command |
flutter_command: ^7.2.2 |
| Binder | flutter_architecture_cli create my_app --binder |
dart run flutter_architecture_cli create my_app --binder |
binder: ^0.4.0 |
| Fish-Redux | flutter_architecture_cli create my_app --fish_redux |
dart run flutter_architecture_cli create my_app --fish_redux |
flying_redux: ^0.1.0 |
| Riverpod | flutter_architecture_cli create my_app --riverpod |
dart run flutter_architecture_cli create my_app --riverpod |
flutter_riverpod: ^2.5.1 |
| Signals | flutter_architecture_cli create my_app --signals |
dart run flutter_architecture_cli create my_app --signals |
signals_flutter: ^5.5.0 |
| MobX | flutter_architecture_cli create my_app --mobx |
dart run flutter_architecture_cli create my_app --mobx |
mobx: ^2.3.0, flutter_mobx: ^2.2.1 (zero build_runner) |
| Redux | flutter_architecture_cli create my_app --redux |
dart run flutter_architecture_cli create my_app --redux |
redux: ^5.0.0, flutter_redux: ^0.10.0 |
| Cubit | flutter_architecture_cli create my_app --cubit |
dart run flutter_architecture_cli create my_app --cubit |
flutter_bloc: ^8.1.6 |
| Pure Provider | flutter_architecture_cli create my_app --provider |
dart run flutter_architecture_cli create my_app --provider |
provider: ^6.1.5+1 |
| flutter_bloc | flutter_architecture_cli create my_app --bloc |
dart run flutter_architecture_cli create my_app --bloc |
flutter_bloc: ^8.1.6 |
| GetX | flutter_architecture_cli create my_app --getx |
dart run flutter_architecture_cli create my_app --getx |
get: ^4.6.6 |
| RxDart + Provider | flutter_architecture_cli create my_app --state rxdart |
dart run flutter_architecture_cli create my_app --state rxdart |
rxdart: ^0.28.0, provider: ^6.1.5+1 |
| Custom Organization | flutter_architecture_cli create my_app --org com.company --riverpod |
dart run flutter_architecture_cli create my_app --org com.company --riverpod |
Sets custom reverse domain |
3. Feature Generation Cheat Sheet (create_feature)
Features automatically inherit your project's state architecture by default:
| Feature Task | Global CLI Syntax | Dev-Dependency Syntax (dart run) |
Notes |
|---|---|---|---|
| Auto-Detect Architecture | flutter_architecture_cli create_feature cart |
dart run flutter_architecture_cli create_feature cart |
Inspects pubspec.yaml & generates matching state |
| Force ValueNotifier | flutter_architecture_cli create_feature cart --valuenotifier |
dart run flutter_architecture_cli create_feature cart --valuenotifier |
Generates Notifier + ValueListenableBuilder |
| Force InheritedWidget | flutter_architecture_cli create_feature cart --inheritedwidget |
dart run flutter_architecture_cli create_feature cart --inheritedwidget |
Generates Controller + InheritedNotifier Scope |
| Force Flutter Hooks | flutter_architecture_cli create_feature cart --hooks |
dart run flutter_architecture_cli create_feature cart --hooks |
Generates HookWidget + useState/useEffect |
| Force Triple | flutter_architecture_cli create_feature cart --triple |
dart run flutter_architecture_cli create_feature cart --triple |
Generates Store + ScopedBuilder |
| Force Elementary | flutter_architecture_cli create_feature cart --elementary |
dart run flutter_architecture_cli create_feature cart --elementary |
Generates ElementaryModel + WidgetModel |
| Force Hydrated BLoC | flutter_architecture_cli create_feature cart --hydrated_bloc |
dart run flutter_architecture_cli create_feature cart --hydrated_bloc |
Generates Persisted HydratedBloc |
| Force StateX | flutter_architecture_cli create_feature cart --statex |
dart run flutter_architecture_cli create_feature cart --statex |
Generates StateXController + StateX view |
| Force Flutter Command | flutter_architecture_cli create_feature cart --command |
dart run flutter_architecture_cli create_feature cart --command |
Generates ViewModel + CommandBuilder |
| Force Binder | flutter_architecture_cli create_feature cart --binder |
dart run flutter_architecture_cli create_feature cart --binder |
Generates StateRef + Logic |
| Force Fish-Redux | flutter_architecture_cli create_feature cart --fish_redux |
dart run flutter_architecture_cli create_feature cart --fish_redux |
Generates Page + Effect + Reducer + Action |
| Force Riverpod | flutter_architecture_cli create_feature cart --riverpod |
dart run flutter_architecture_cli create_feature cart --riverpod |
Generates StateNotifier + ConsumerStatefulWidget |
| Force Signals | flutter_architecture_cli create_feature cart --signals |
dart run flutter_architecture_cli create_feature cart --signals |
Generates signal() + Watch view |
| Force MobX | flutter_architecture_cli create_feature cart --mobx |
dart run flutter_architecture_cli create_feature cart --mobx |
Generates Store + Observer (zero build_runner) |
| Force Redux | flutter_architecture_cli create_feature cart --redux |
dart run flutter_architecture_cli create_feature cart --redux |
Generates Actions + Reducer + Thunks |
| Force Cubit | flutter_architecture_cli create_feature cart --cubit |
dart run flutter_architecture_cli create_feature cart --cubit |
Generates Cubit + BlocBuilder |
| Force Pure Provider | flutter_architecture_cli create_feature cart --provider |
dart run flutter_architecture_cli create_feature cart --provider |
Generates ChangeNotifier + Consumer |
| Force flutter_bloc | flutter_architecture_cli create_feature cart --bloc |
dart run flutter_architecture_cli create_feature cart --bloc |
Generates Events + States + BlocBuilder |
| Force GetX | flutter_architecture_cli create_feature cart --getx |
dart run flutter_architecture_cli create_feature cart --getx |
Generates Controller + Bindings + Obx |
| Force RxDart | flutter_architecture_cli create_feature cart --state rxdart |
dart run flutter_architecture_cli create_feature cart --state rxdart |
Generates BehaviorSubject + StreamBuilder |
4. Granular Layer Generators Cheat Sheet
Use these granular subcommands when you only need a specific architectural layer without scaffolding an entire feature:
| Granular Task | Global CLI Syntax | Dev-Dependency Syntax (dart run) |
Target Output Location |
|---|---|---|---|
| Create Screen | flutter_architecture_cli create_screen checkout -f cart |
dart run flutter_architecture_cli create_screen checkout -f cart |
lib/src/cart/presentation/view/checkout_screen.dart |
| Create Model & DTO | flutter_architecture_cli create_model item -f cart |
dart run flutter_architecture_cli create_model item -f cart |
lib/src/cart/model/ui_entity/item_ui_entity.dartlib/src/cart/model/response/item_response.dart |
| Create DataSource | flutter_architecture_cli create_datasource cart -f cart |
dart run flutter_architecture_cli create_datasource cart -f cart |
lib/src/cart/data_source/cart_datasource.dart |
| Create Repository | flutter_architecture_cli create_repository cart -f cart |
dart run flutter_architecture_cli create_repository cart -f cart |
lib/src/cart/repository/cart_repository.dart (auto-links DataSource) |
| Create Core Service | flutter_architecture_cli create_service auth |
dart run flutter_architecture_cli create_service auth |
lib/core/services/auth_service.dart (thread-safe singleton) |
| Change Package / Bundle ID | flutter_architecture_cli change_bundle_id com.company.shop |
dart run flutter_architecture_cli change_bundle_id com.company.shop |
Android Gradle, Kotlin/Java folders, Manifest, & iOS Xcode |
FVM (Flutter Version Management) Support
flutter_architecture_cli includes complete, first-class support for FVM out of the box.
Why FVM Support Was Added (v1.0.4)
Previously, developers who set up FVM using shell aliases (e.g., alias flutter="fvm flutter")
encountered command not found (exit code 127) because non-interactive subshells do not source
.zshrc / .bashrc aliases. In v1.0.4+, the CLI natively detects FVM binaries and routes all
Flutter and Dart operations through fvm flutter and fvm dart seamlessly.
How FVM Works in this CLI
- Smart Auto-Detection:
- Missing Global Flutter: If
flutteris missing from your systemPATHbutfvmis installed, the CLI automatically detects FVM and switches tofvm flutterwithout requiring any manual flags. - Workspace Detection: If an
.fvm/directory or.fvmrcfile exists in your workspace, FVM is automatically preferred for all operations.
- Missing Global Flutter: If
- Explicit Flags (
--fvmand--fvm-version):- Pass
--fvmto explicitly force FVM execution:flutter_architecture_cli create my_app --fvm - Optionally pin a specific Flutter version during creation:
flutter_architecture_cli create my_app --fvm --fvm-version 3.22.0
- Pass
- Automated IDE & Git Configuration:
- Automatically adds
.fvm/flutter_sdkto the generated.gitignore. - Automatically creates
.vscode/settings.jsonwith"dart.flutterSdkPath": ".fvm/flutter_sdk"so VS Code immediately binds the correct Flutter SDK.
- Automatically adds
- All Subcommands Support FVM:
- When running feature, screen, or model generation inside an FVM project, code formatting
automatically uses
fvm dart format.
- When running feature, screen, or model generation inside an FVM project, code formatting
automatically uses
Quick FVM Cheat Sheet
| Task | Standard Flutter | With FVM |
|---|---|---|
| Global Install | dart pub global activate flutter_architecture_cli |
fvm dart pub global activate flutter_architecture_cli |
| Add as Dev Dependency | flutter pub add --dev flutter_architecture_cli |
fvm flutter pub add --dev flutter_architecture_cli |
| Create Project (Interactive) | flutter_architecture_cli create my_app |
flutter_architecture_cli create my_app --fvm |
| Create with ValueNotifier | flutter_architecture_cli create my_app --valuenotifier |
flutter_architecture_cli create my_app --valuenotifier --fvm |
| Create with InheritedWidget | flutter_architecture_cli create my_app --inheritedwidget |
flutter_architecture_cli create my_app --inheritedwidget --fvm |
| Create with Flutter Hooks | flutter_architecture_cli create my_app --hooks |
flutter_architecture_cli create my_app --hooks --fvm |
| Create with Triple | flutter_architecture_cli create my_app --triple |
flutter_architecture_cli create my_app --triple --fvm |
| Create with Elementary | flutter_architecture_cli create my_app --elementary |
flutter_architecture_cli create my_app --elementary --fvm |
| Create with Hydrated BLoC | flutter_architecture_cli create my_app --hydrated_bloc |
flutter_architecture_cli create my_app --hydrated_bloc --fvm |
| Create with StateX | flutter_architecture_cli create my_app --statex |
flutter_architecture_cli create my_app --statex --fvm |
| Create with Flutter Command | flutter_architecture_cli create my_app --command |
flutter_architecture_cli create my_app --command --fvm |
| Create with Binder | flutter_architecture_cli create my_app --binder |
flutter_architecture_cli create my_app --binder --fvm |
| Create with Fish-Redux | flutter_architecture_cli create my_app --fish_redux |
flutter_architecture_cli create my_app --fish_redux --fvm |
| Create with Riverpod | flutter_architecture_cli create my_app --riverpod |
flutter_architecture_cli create my_app --riverpod --fvm |
| Create with Signals | flutter_architecture_cli create my_app --signals |
flutter_architecture_cli create my_app --signals --fvm |
| Create with MobX | flutter_architecture_cli create my_app --mobx |
flutter_architecture_cli create my_app --mobx --fvm |
| Create with Redux | flutter_architecture_cli create my_app --redux |
flutter_architecture_cli create my_app --redux --fvm |
| Create with Cubit | flutter_architecture_cli create my_app --cubit |
flutter_architecture_cli create my_app --cubit --fvm |
| Create with Pure Provider | flutter_architecture_cli create my_app --provider |
flutter_architecture_cli create my_app --provider --fvm |
| Create with BLoC | flutter_architecture_cli create my_app --bloc |
flutter_architecture_cli create my_app --bloc --fvm |
| Create with GetX | flutter_architecture_cli create my_app --getx |
flutter_architecture_cli create my_app --getx --fvm |
| Create with Pinned SDK | N/A | flutter_architecture_cli create my_app --fvm --fvm-version 3.22.0 |
| Create Feature | dart run flutter_architecture_cli create_feature auth |
fvm dart run flutter_architecture_cli create_feature auth |
| Create Screen | dart run flutter_architecture_cli create_screen home -f auth |
fvm dart run flutter_architecture_cli create_screen home -f auth |
| Create Model | dart run flutter_architecture_cli create_model user -f auth |
fvm dart run flutter_architecture_cli create_model user -f auth |
| Create DataSource | dart run flutter_architecture_cli create_datasource auth -f auth |
fvm dart run flutter_architecture_cli create_datasource auth -f auth |
| Create Repository | dart run flutter_architecture_cli create_repository auth -f auth |
fvm dart run flutter_architecture_cli create_repository auth -f auth |
| Create Service | dart run flutter_architecture_cli create_service api |
fvm dart run flutter_architecture_cli create_service api |
| Change Bundle ID | flutter_architecture_cli change_bundle_id com.my.app |
flutter_architecture_cli change_bundle_id com.my.app |
Features
- Zero-Configuration Architecture Setup: Instant scaffolding covering storage, networking, localizations, utility helpers, and dependency injection.
- 19 State Management Architectures: Full out-of-the-box support for ValueNotifier, InheritedWidget, Flutter Hooks, Triple, Elementary, Hydrated BLoC, StateX, Flutter Command, Binder, Fish-Redux, Riverpod, Signals, MobX, Redux, Cubit, Pure Provider, flutter_bloc, GetX, and RxDart + Provider.
- Smart Architecture Auto-Detection: Commands like
create_featureautomatically inspect your project'spubspec.yamland feature folders to detect any of the 19 architectures and generate matching code with 0 configuration. - Centralized Networking: Custom
ApiClientpowered byDiowith automatic logging, secure token handling, and robust exception-handling interceptors. - Common Widget Toolkit: Reusable components such as
AppText,AppImage,AppTextField,AppButton,AppLoader,AppShimmer, andAppNetworkStatusWidget. - Built-in Validation Engine: Comprehensive
Validatorsutility coveringrequired,email,phone,minLength,maxLength,password,numeric,url, andcompose(...)validation chains. - JSON-Based Localization: Fully configured translations with convenient context translation
extensions (
context.tr(...)). - FVM Compatible: Effortless compatibility for teams managing Flutter versions with FVM.
Folder Structure
Generating a project produces this clean, production-ready tree:
lib/
├── common/
│ ├── extensions/ # BuildContext, String, DateTime and Widget extensions
│ ├── helpers/ # Bottom sheets, dialogs, snackbars, and navigation helpers
│ └── widgets/ # Reusable widgets (AppButton, AppLoader, AppText, AppErrorWidget, etc.)
├── core/
│ ├── base/ # BaseBloc, BaseMapper, and BaseUiState
│ ├── constants/ # Api endpoints, dimensions, route names, regex, etc.
│ ├── localization/ # Localization service and JSON delegates
│ ├── network/ # ApiClient configurations, interceptors, and custom exceptions
│ ├── storage/ # SharedPreferences manager and secure storage
│ ├── theme/ # AppThemeData, custom borders, shadows, and text styles
│ └── utils/ # Validators, connectivity helpers, pickers, and logger
├── src/
│ └── users/ # Pre-generated dummy feature showcasing clean architecture
└── main.dart # Application root bootstrapper
Feature Structure Comparison by State Management:
Riverpod (--riverpod or [6]) |
Signals (--signals or [7]) |
MobX (--mobx or [8]) |
Redux (--redux or [9]) |
|---|---|---|---|
lib/src/users/├── provider/user_notifier.dart├── state/user_state.dart├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart├── presentation/view/user_screen.dart└── repository/user_repository.dart |
lib/src/users/├── signals/user_signals.dart├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart├── presentation/view/user_screen.dart└── repository/user_repository.dart |
lib/src/users/├── store/user_store.dart├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart├── presentation/view/user_screen.dart└── repository/user_repository.dart |
lib/src/users/├── redux/│ ├── user_actions.dart│ ├── user_reducer.dart│ └── user_state.dart├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart├── presentation/view/user_screen.dart└── repository/user_repository.dart |
Cubit (--cubit or [4]) |
Pure Provider (--provider or [5]) |
flutter_bloc (--bloc or [2]) |
GetX (--getx or [3]) |
RxDart + Provider (--state rxdart or [1]) |
|---|---|---|---|---|
lib/src/users/├── cubit/│ ├── user_cubit.dart│ └── user_state.dart├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart├── presentation/view/user_screen.dart└── repository/user_repository.dart |
lib/src/users/├── provider/user_provider.dart├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart├── presentation/view/user_screen.dart└── repository/user_repository.dart |
lib/src/users/├── bloc/│ ├── user_bloc.dart│ ├── user_event.dart│ └── user_state.dart├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart├── presentation/view/user_screen.dart└── repository/user_repository.dart |
lib/src/users/├── binding/user_binding.dart├── controller/user_controller.dart├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart├── presentation/view/user_screen.dart└── repository/user_repository.dart |
lib/src/users/├── bloc/user_bloc.dart├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart├── presentation/view/user_screen.dart├── repository/user_repository.dart└── state/├── user_state.dart└── user_provider.dart |
ValueNotifier (--valuenotifier or [10]) |
InheritedWidget (--inheritedwidget or [11]) |
Flutter Hooks (--hooks or [12]) |
Triple (--triple or [13]) |
Elementary (--elementary or [14]) |
|---|---|---|---|---|
lib/src/users/├── notifier/user_notifier.dart├── state/user_state.dart├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart├── presentation/view/user_screen.dart└── repository/user_repository.dart |
lib/src/users/├── controller/│ ├── user_controller.dart│ └── user_scope.dart├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart├── presentation/view/user_screen.dart└── repository/user_repository.dart |
lib/src/users/├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart├── presentation/view/user_screen.dart└── repository/user_repository.dart |
lib/src/users/├── store/user_store.dart├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart├── presentation/view/user_screen.dart└── repository/user_repository.dart |
lib/src/users/├── model/user_model.dart├── widget_model/user_widget_model.dart├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart├── presentation/view/user_screen.dart└── repository/user_repository.dart |
Hydrated BLoC (--hydrated_bloc or [15]) |
StateX (--statex or [16]) |
Flutter Command (--command or [17]) |
Binder (--binder or [18]) |
Fish-Redux (--fish_redux or [19]) |
|---|---|---|---|---|
lib/src/users/├── bloc/│ ├── user_bloc.dart│ ├── user_event.dart│ └── user_state.dart├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart├── presentation/view/user_screen.dart└── repository/user_repository.dart |
lib/src/users/├── controller/user_controller.dart├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart├── presentation/view/user_screen.dart└── repository/user_repository.dart |
lib/src/users/├── view_model/user_view_model.dart├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart├── presentation/view/user_screen.dart└── repository/user_repository.dart |
lib/src/users/├── logic/user_logic.dart├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart├── presentation/view/user_screen.dart└── repository/user_repository.dart |
lib/src/users/├── redux/│ ├── user_action.dart│ ├── user_state.dart│ ├── user_reducer.dart│ └── user_effect.dart├── presentation/│ ├── page/user_page.dart│ └── view/user_view.dart├── data_source/user_datasource.dart├── mapper/user_mapper.dart├── model/│ ├── response/user_response.dart│ └── ui_entity/user_ui_entity.dart└── repository/user_repository.dart |
State Management Isolation
In flutter_architecture_cli, all 19 state management architectures are 100% strictly
segregated. When you select an architecture, your generated project contains only that
architecture's required dependencies and base classes:
Architectural Breakdown Across All 19 Choices:
| State Choice | Dependencies in pubspec.yaml |
Base Classes (lib/core/base/) |
Root Widget (lib/main.dart) |
UI Reactive Widget |
|---|---|---|---|---|
ValueNotifier (--valuenotifier or [10]) |
(Zero dependencies - Pure Flutter) | base_mapper.dartbase_ui_state.dart |
const MyApp() |
ValueListenableBuilder<UserState> |
InheritedWidget (--inheritedwidget or [11]) |
(Zero dependencies - Pure Flutter) | base_mapper.dartbase_ui_state.dart |
const MyApp() |
InheritedNotifier<UserController> |
Flutter Hooks (--hooks or [12]) |
flutter_hooks: ^0.20.5 |
base_mapper.dartbase_ui_state.dart |
const MyApp() |
HookWidget / useState / useEffect |
Triple (--triple or [13]) |
flutter_triple: ^3.0.0 |
base_mapper.dartbase_ui_state.dart |
const MyApp() |
ScopedBuilder<UserStore, List<UserUiEntity>> |
Elementary (--elementary or [14]) |
elementary: ^3.2.1elementary_helper: ^1.1.0 |
base_mapper.dartbase_ui_state.dart |
const MyApp() |
ElementaryWidget<IUserWidgetModel> |
Hydrated BLoC (--hydrated_bloc or [15]) |
flutter_bloc: ^8.1.6hydrated_bloc: ^9.1.5path_provider: ^2.1.2 |
base_mapper.dartbase_ui_state.dart |
MultiRepositoryProvider |
BlocProvider + BlocBuilder (persisted to disk) |
StateX (--statex or [16]) |
state_extended: ^7.6.0 |
base_mapper.dartbase_ui_state.dart |
const MyApp() |
StateX<UserScreen> + StateXController |
Flutter Command (--command or [17]) |
flutter_command: ^7.2.2 |
base_mapper.dartbase_ui_state.dart |
const MyApp() |
CommandBuilder<void, List<UserUiEntity>> |
Binder (--binder or [18]) |
binder: ^0.4.0 |
base_mapper.dartbase_ui_state.dart |
BinderScope(child: MyApp()) |
context.watch(userViewStateRef) / context.use |
Fish-Redux (--fish_redux or [19]) |
flying_redux: ^0.1.0 |
base_mapper.dartbase_ui_state.dart |
UserPage().buildPage(null) |
Page + Effect + Reducer + View |
Riverpod (--riverpod or [6]) |
flutter_riverpod: ^2.5.1 |
base_mapper.dartbase_ui_state.dart |
ProviderScope(child: MyApp()) |
ConsumerStatefulWidget / ref.watch |
Signals (--signals or [7]) |
signals_flutter: ^5.5.0 |
base_mapper.dartbase_ui_state.dart |
const MyApp() |
Watch((context) => ...) |
MobX (--mobx or [8]) |
mobx: ^2.3.0flutter_mobx: ^2.2.1 |
base_mapper.dartbase_ui_state.dart |
const MyApp() |
Observer(builder: ...) (zero build_runner) |
Redux (--redux or [9]) |
redux: ^5.0.0flutter_redux: ^0.10.0 |
base_mapper.dartbase_ui_state.dart+ core/redux/app_state.dart |
StoreProvider(store: ..., child: MyApp()) |
StoreConnector<AppState, VM> |
Cubit (--cubit or [4]) |
flutter_bloc: ^8.1.6 |
base_mapper.dartbase_ui_state.dart |
MultiRepositoryProvider |
BlocProvider + BlocBuilder |
Pure Provider (--provider or [5]) |
provider: ^6.1.5+1 |
base_mapper.dartbase_ui_state.dart |
MultiProvider |
ChangeNotifierProvider + Consumer |
flutter_bloc (--bloc or [2]) |
flutter_bloc: ^8.1.6 |
base_mapper.dartbase_ui_state.dart |
MultiRepositoryProvider |
BlocProvider + BlocBuilder |
GetX (--getx or [3]) |
get: ^4.6.6 |
base_mapper.dartbase_ui_state.dart |
GetMaterialApp |
GetView<T> + Obx(() => ...) |
RxDart + Provider (--state rxdart or [1]) |
rxdart: ^0.28.0provider: ^6.1.5+1 |
base_bloc.dartbase_mapper.dartbase_ui_state.dart |
MultiProvider |
StreamBuilder + Provider.of |
Usage Guide
You can run commands in two ways depending on how you installed the package:
- As a project dev dependency (Recommended): Prefix with
dart run flutter_architecture_cli(orfvm dart run flutter_architecture_cli). - Globally activated: Run
flutter_architecture_cli <command>directly.
Below is the detailed reference for all 8 available commands.
1. create: Scaffold a New Clean Architecture App
Creates a complete, production-ready Flutter application with all architectural layers, common widgets, networking, storage, localization, and a working smoke test. Supports 19 state management architectures.
Interactive State Management Selection:
When running in an interactive terminal, the CLI prompts you to select your preferred architecture:
Select State Management Architecture:
[1] RxDart + Provider (Stream-based) [Default]
[2] flutter_bloc (Event & State based BLoC)
[3] GetX (Reactive Controller & Bindings)
[4] Cubit (Simplified method-based BLoC)
[5] Provider (Pure ChangeNotifier & Consumer)
[6] Riverpod (Modern Reactive Providers)
[7] Signals (Fine-grained Reactivity)
[8] MobX (Observable & Action)
[9] Redux (Central Store & Reducer)
[10] ValueNotifier (Native ListenableBuilder - Zero Dependency)
[11] InheritedWidget (Native InheritedNotifier - Zero Dependency)
[12] Flutter Hooks (HookWidget & useState)
[13] Triple (flutter_triple - Store & ScopedBuilder)
[14] Elementary (MVVM - WidgetModel & ElementaryModel)
[15] Hydrated BLoC (Persisted State BLoC)
[16] StateX (MVC - StateXController & StateX)
[17] Flutter Command (MVVM - Command & CommandBuilder)
[18] Binder (StateRef, Logic & BinderScope)
[19] Fish-Redux (Component-Redux - Page, Effect & Reducer)
Choose an option (1-19) [default: 1]:
Syntax & Options:
# Basic syntax
flutter_architecture_cli create <app_name> [options]
# Options:
# --state State management architecture: 'rxdart', 'bloc', 'getx', 'cubit', 'provider', 'riverpod', 'signals', 'mobx', 'redux', 'valuenotifier', 'inheritedwidget', 'hooks', 'triple', 'elementary', 'hydrated_bloc', 'statex', 'command', 'binder', or 'fish_redux' (default: rxdart)
# --valuenotifier Shortcut flag to scaffold using ValueNotifier (zero external dependencies)
# --inheritedwidget Shortcut flag to scaffold using InheritedWidget (pure Flutter SDK)
# --hooks Shortcut flag to scaffold using Flutter Hooks
# --triple Shortcut flag to scaffold using Triple (flutter_triple)
# --elementary Shortcut flag to scaffold using Elementary (MVVM)
# --hydrated_bloc Shortcut flag to scaffold using Hydrated BLoC (Persisted State)
# --statex Shortcut flag to scaffold using StateX (MVC)
# --command Shortcut flag to scaffold using Flutter Command (MVVM)
# --binder Shortcut flag to scaffold using Binder
# --fish_redux Shortcut flag to scaffold using Fish-Redux
# --riverpod Shortcut flag to scaffold using Riverpod
# --signals Shortcut flag to scaffold using Signals
# --mobx Shortcut flag to scaffold using MobX
# --redux Shortcut flag to scaffold using Redux
# --cubit Shortcut flag to scaffold using Cubit
# --provider Shortcut flag to scaffold using Pure Provider
# --bloc Shortcut flag to scaffold using flutter_bloc
# --getx Shortcut flag to scaffold using GetX
# --org Organization reverse-domain (default: com.example)
# --fvm Use FVM (Flutter Version Management) for creation & formatting
# --fvm-version Pin a specific Flutter SDK version in FVM (e.g., 3.22.0)
Examples:
# Interactive creation (prompts for architecture selection)
flutter_architecture_cli create my_shop_app
# Scaffold with ValueNotifier directly (zero external dependencies):
flutter_architecture_cli create my_vn_app --valuenotifier
# Scaffold with InheritedWidget directly (pure Flutter SDK):
flutter_architecture_cli create my_iw_app --inheritedwidget
# Scaffold with Flutter Hooks directly:
flutter_architecture_cli create my_hooks_app --hooks
# Scaffold with Triple directly:
flutter_architecture_cli create my_triple_app --triple
# Scaffold with Elementary (MVVM) directly:
flutter_architecture_cli create my_elementary_app --elementary
# Scaffold with Hydrated BLoC directly:
flutter_architecture_cli create my_hydrated_app --hydrated_bloc
# Scaffold with StateX (MVC) directly:
flutter_architecture_cli create my_statex_app --statex
# Scaffold with Flutter Command directly:
flutter_architecture_cli create my_command_app --command
# Scaffold with Binder directly:
flutter_architecture_cli create my_binder_app --binder
# Scaffold with Fish-Redux directly:
flutter_architecture_cli create my_fish_app --fish_redux
# Scaffold with Riverpod directly:
flutter_architecture_cli create my_riverpod_app --riverpod
# Scaffold with Signals directly:
flutter_architecture_cli create my_signals_app --signals
# Scaffold with MobX directly:
flutter_architecture_cli create my_mobx_app --mobx
# Scaffold with Redux directly:
flutter_architecture_cli create my_redux_app --redux
# Scaffold with Cubit directly:
flutter_architecture_cli create my_cubit_app --cubit
# Scaffold with Pure Provider directly:
flutter_architecture_cli create my_provider_app --provider
# Scaffold with flutter_bloc directly:
flutter_architecture_cli create my_bloc_app --bloc
# Scaffold with GetX directly:
flutter_architecture_cli create my_getx_app --getx
# Scaffold with RxDart + Provider directly:
flutter_architecture_cli create my_shop_app --state rxdart
# With custom package / bundle ID domain
flutter_architecture_cli create my_shop_app --org com.mycompany --riverpod
# With FVM and pinned Flutter version
flutter_architecture_cli create my_shop_app --fvm --fvm-version 3.24.0 --riverpod
What it generates:
- Full Clean Architecture folder structure (
lib/common/,lib/core/,lib/src/users/). lib/main.dartwith pre-configured DI, Localization, and Theme tailored to your selected architecture.- Strict State Management Isolation: Only the selected architecture's dependencies are
installed:
- ValueNotifier: Zero external state management dependencies (pure Flutter SDK). Uses
ValueNotifierandValueListenableBuilder. - InheritedWidget: Zero external state management dependencies (pure Flutter SDK). Uses
InheritedNotifierandChangeNotifier. - Flutter Hooks: Adds
flutter_hooks: ^0.20.5. UsesHookWidget,useState, anduseEffect. - Triple: Adds
flutter_triple: ^3.0.0. UsesStore<T>andScopedBuilder. - Elementary: Adds
elementary: ^3.2.1andelementary_helper: ^1.1.0. UsesElementaryModelandWidgetModel. - Hydrated BLoC: Adds
hydrated_bloc: ^9.1.5,flutter_bloc: ^8.1.6, andpath_provider: ^2.1.2. Automatically persists BLoC state to disk. - StateX: Adds
state_extended: ^7.6.0. UsesStateXControllerandStateX. - Flutter Command: Adds
flutter_command: ^7.2.2. UsesCommandandCommandBuilder. - Binder: Adds
binder: ^0.4.0. UsesStateRef,Logic, andBinderScope. - Fish-Redux: Adds
flying_redux: ^0.1.0. UsesPage,Effect,Action, andReducer. - Riverpod: Adds only
flutter_riverpod: ^2.5.1. UsesProviderScopeandConsumerStatefulWidget. - Signals: Adds only
signals_flutter: ^5.5.0. Uses fine-grainedsignal()andWatch(). - MobX: Adds only
mobx: ^2.3.0andflutter_mobx: ^2.2.1. Zerobuild_runnerrequired. - Redux: Adds only
redux: ^5.0.0andflutter_redux: ^0.10.0. UsesStoreProviderandStoreConnector. - Cubit: Adds only
flutter_bloc: ^8.1.6. UsesMultiRepositoryProvider. - Pure Provider: Adds only
provider: ^6.1.5+1. UsesMultiProvider. - flutter_bloc: Adds only
flutter_bloc: ^8.1.6. UsesMultiRepositoryProvider. - GetX: Adds only
get: ^4.6.6. Uses GetXBindingsandGet.put. - RxDart + Provider: Adds
rxdart: ^0.28.0andprovider: ^6.1.5+1.
- ValueNotifier: Zero external state management dependencies (pure Flutter SDK). Uses
- A functional dummy
usersfeature showcasing the full DataSource + Repository + Mapper + UI Entity data flow. - A passing
test/widget_test.dartsmoke test customized for your state management. - Automatically adds
flutter_architecture_cli: ^1.0.6todev_dependenciesinsidepubspec.yaml.
2. create_feature: Generate a Complete Feature Layer
Instantly creates an entire feature-first folder structure with state management, data, and presentation layers wired together.
Tip
Smart Architecture Auto-Detection: create_feature inspects your pubspec.yaml and existing
feature folders. It automatically detects any of the 19 supported architectures:
flutter_hooks:→ Flutter Hooksflutter_triple:→ Tripleelementary:→ Elementaryhydrated_bloc:→ Hydrated BLoCstate_extended:→ StateXflutter_command:→ Flutter Commandbinder:→ Binderflying_redux:→ Fish-Reduxsignals_flutter:→ Signalsflutter_riverpod:→ Riverpodmobx:→ MobXredux:→ Reduxget:→ GetXflutter_bloc:→ checks forcubit/directories to generate Cubit, or defaults to BLoCprovider:(withoutrxdart:) → Pure Provider- InheritedWidget directory structure → InheritedWidget
- ValueNotifier directory structure → ValueNotifier
- Default fallback → RxDart stream pattern!
You can also explicitly pass flags like
--valuenotifier,--inheritedwidget,--hooks,--triple,--elementary,--hydrated_bloc,--statex,--command,--binder,--fish_redux,--riverpod,--signals,--mobx,--redux,--cubit,--provider,--bloc,--getx, or--state <choice>.
Syntax & Options:
flutter_architecture_cli create_feature <feature_name> [options]
# Options:
# --state State management override:
# 'valuenotifier', 'inheritedwidget', 'hooks', 'triple', 'elementary',
# 'hydrated_bloc', 'statex', 'command', 'binder', 'fish_redux',
# 'riverpod', 'signals', 'mobx', 'redux', 'cubit', 'provider',
# 'bloc', 'getx', or 'rxdart'
# --valuenotifier Shortcut flag for ValueNotifier feature generation
# --inheritedwidget Shortcut flag for InheritedWidget feature generation
# --hooks Shortcut flag for Flutter Hooks feature generation
# --triple Shortcut flag for Triple feature generation
# --elementary Shortcut flag for Elementary feature generation
# --hydrated_bloc Shortcut flag for Hydrated BLoC feature generation
# --statex Shortcut flag for StateX feature generation
# --command Shortcut flag for Flutter Command feature generation
# --binder Shortcut flag for Binder feature generation
# --fish_redux Shortcut flag for Fish-Redux feature generation
# --riverpod Shortcut flag for Riverpod feature generation
# --signals Shortcut flag for Signals feature generation
# --mobx Shortcut flag for MobX feature generation
# --redux Shortcut flag for Redux feature generation
# --cubit Shortcut flag for Cubit feature generation
# --provider Shortcut flag for Pure Provider feature generation
# --bloc Shortcut flag for flutter_bloc feature generation
# --getx Shortcut flag for GetX feature generation
# --fvm Format generated code using FVM
Examples:
# Auto-detects architecture from pubspec.yaml & feature directories:
dart run flutter_architecture_cli create_feature products
# Explicitly create as ValueNotifier:
dart run flutter_architecture_cli create_feature products --valuenotifier
# Explicitly create as InheritedWidget:
dart run flutter_architecture_cli create_feature products --inheritedwidget
# Explicitly create as Flutter Hooks:
dart run flutter_architecture_cli create_feature products --hooks
# Explicitly create as Triple:
dart run flutter_architecture_cli create_feature products --triple
# Explicitly create as Elementary:
dart run flutter_architecture_cli create_feature products --elementary
# Explicitly create as Hydrated BLoC:
dart run flutter_architecture_cli create_feature products --hydrated_bloc
# Explicitly create as StateX:
dart run flutter_architecture_cli create_feature products --statex
# Explicitly create as Flutter Command:
dart run flutter_architecture_cli create_feature products --command
# Explicitly create as Binder:
dart run flutter_architecture_cli create_feature products --binder
# Explicitly create as Fish-Redux:
dart run flutter_architecture_cli create_feature products --fish_redux
# Explicitly create as Riverpod:
dart run flutter_architecture_cli create_feature products --riverpod
# Explicitly create as Signals:
dart run flutter_architecture_cli create_feature products --signals
# Explicitly create as MobX:
dart run flutter_architecture_cli create_feature products --mobx
# Explicitly create as Redux:
dart run flutter_architecture_cli create_feature products --redux
# Explicitly create as Cubit:
dart run flutter_architecture_cli create_feature products --cubit
# Explicitly create as Pure Provider:
dart run flutter_architecture_cli create_feature products --provider
# Explicitly create as flutter_bloc:
dart run flutter_architecture_cli create_feature products --bloc
# Explicitly create as GetX:
dart run flutter_architecture_cli create_feature products --getx
# Explicitly create as RxDart:
dart run flutter_architecture_cli create_feature products --state rxdart
# With FVM
fvm dart run flutter_architecture_cli create_feature products
Generated Structure with Riverpod:
lib/src/products/
├── data_source/
│ └── products_datasource.dart # ApiClient data layer
├── mapper/
│ └── products_mapper.dart # Transforms Response DTO → UiEntity
├── model/
│ ├── request/ # Request parameter models placeholder
│ ├── response/
│ │ └── products_response.dart # Raw JSON network DTO with fromJson/toJson
│ └── ui_entity/
│ └── products_ui_entity.dart # Clean UI domain entity
├── presentation/
│ ├── view/
│ │ └── products_screen.dart # ConsumerStatefulWidget with ref.watch & reactive state
│ └── widget/ # Custom widgets for this feature
├── provider/
│ └── products_notifier.dart # StateNotifier<ProductsState> & StateNotifierProvider
├── repository/
│ └── products_repository.dart # Bridge between DataSource & Notifier
└── state/
└── products_state.dart # ProductsInitialState, LoadingState, LoadedState, ErrorState
Generated Structure with Signals:
lib/src/products/
├── data_source/
│ └── products_datasource.dart # ApiClient data layer
├── mapper/
│ └── products_mapper.dart # Transforms Response DTO → UiEntity
├── model/
│ ├── request/ # Request parameter models placeholder
│ ├── response/
│ │ └── products_response.dart # Raw JSON network DTO with fromJson/toJson
│ └── ui_entity/
│ └── products_ui_entity.dart # Clean UI domain entity
├── presentation/
│ ├── view/
│ │ └── products_screen.dart # Watch((context) => ...) with fine-grained reactivity
│ └── widget/ # Custom widgets for this feature
├── repository/
│ └── products_repository.dart # Bridge between DataSource & Signals
└── signals/
└── products_signals.dart # Reactive signal() state containers
Generated Structure with MobX:
lib/src/products/
├── data_source/
│ └── products_datasource.dart # ApiClient data layer
├── mapper/
│ └── products_mapper.dart # Transforms Response DTO → UiEntity
├── model/
│ ├── request/ # Request parameter models placeholder
│ ├── response/
│ │ └── products_response.dart # Raw JSON network DTO with fromJson/toJson
│ └── ui_entity/
│ └── products_ui_entity.dart # Clean UI domain entity
├── presentation/
│ ├── view/
│ │ └── products_screen.dart # Observer(builder: ...) reactive view (zero build_runner)
│ └── widget/ # Custom widgets for this feature
├── repository/
│ └── products_repository.dart # Bridge between DataSource & Store
└── store/
└── products_store.dart # ObservableList, Observable, and runInAction mutations
Generated Structure with Redux:
lib/src/products/
├── data_source/
│ └── products_datasource.dart # ApiClient data layer
├── mapper/
│ └── products_mapper.dart # Transforms Response DTO → UiEntity
├── model/
│ ├── request/ # Request parameter models placeholder
│ ├── response/
│ │ └── products_response.dart # Raw JSON network DTO with fromJson/toJson
│ └── ui_entity/
│ └── products_ui_entity.dart # Clean UI domain entity
├── presentation/
│ ├── view/
│ │ └── products_screen.dart # StoreConnector<AppState, VM> connected view
│ └── widget/ # Custom widgets for this feature
├── redux/
│ ├── products_actions.dart # Action classes and async fetch/refresh thunks
│ ├── products_reducer.dart # Pure reducer updating ProductsState
│ └── products_state.dart # Immutable state container with copyWith
└── repository/
└── products_repository.dart # Bridge between DataSource & Thunk actions
Generated Structure with Cubit:
lib/src/products/
├── cubit/
│ ├── products_cubit.dart # Cubit<ProductsState> with emit() methods
│ └── products_state.dart # ProductsInitialState, LoadingState, LoadedState, ErrorState
├── data_source/
│ └── products_datasource.dart # ApiClient data layer
├── mapper/
│ └── products_mapper.dart # Transforms Response DTO → UiEntity
├── model/
│ ├── request/ # Request parameter models placeholder
│ ├── response/
│ │ └── products_response.dart # Raw JSON network DTO with fromJson/toJson
│ └── ui_entity/
│ └── products_ui_entity.dart # Clean UI domain entity
├── presentation/
│ ├── view/
│ │ └── products_screen.dart # BlocProvider + BlocBuilder view with Loader & Error
│ └── widget/ # Custom widgets for this feature
└── repository/
└── products_repository.dart # Bridge between DataSource & Cubit
Generated Structure with Pure Provider:
lib/src/products/
├── data_source/
│ └── products_datasource.dart # ApiClient data layer
├── mapper/
│ └── products_mapper.dart # Transforms Response DTO → UiEntity
├── model/
│ ├── request/ # Request parameter models placeholder
│ ├── response/
│ │ └── products_response.dart # Raw JSON network DTO with fromJson/toJson
│ └── ui_entity/
│ └── products_ui_entity.dart # Clean UI domain entity
├── presentation/
│ ├── view/
│ │ └── products_screen.dart # ChangeNotifierProvider + Consumer view
│ └── widget/ # Custom widgets for this feature
├── provider/
│ └── products_provider.dart # ChangeNotifier state container with notifyListeners()
└── repository/
└── products_repository.dart # Bridge between DataSource & Provider
Generated Structure with GetX:
lib/src/products/
├── binding/
│ └── products_binding.dart # Bindings DI registration (Get.lazyPut)
├── controller/
│ └── products_controller.dart # GetxController with reactive .obs state
├── data_source/
│ └── products_datasource.dart # ApiClient data layer
├── mapper/
│ └── products_mapper.dart # Transforms Response DTO → UiEntity
├── model/
│ ├── request/ # Request parameter models placeholder
│ ├── response/
│ │ └── products_response.dart # Raw JSON network DTO with fromJson/toJson
│ └── ui_entity/
│ └── products_ui_entity.dart # Clean UI domain entity
├── presentation/
│ ├── view/
│ │ └── products_screen.dart # GetView<ProductsController> with Obx reactive UI
│ └── widget/ # Custom widgets for this feature
└── repository/
└── products_repository.dart # Bridge between DataSource & Controller
Generated Structure with flutter_bloc:
lib/src/products/
├── bloc/
│ ├── products_bloc.dart # Bloc<ProductsEvent, ProductsState>
│ ├── products_event.dart # FetchProductsEvent, etc.
│ └── products_state.dart # BaseUiState subclass with initial/loading/completed/error
├── data_source/
│ └── products_datasource.dart # ApiClient data layer
├── mapper/
│ └── products_mapper.dart # Transforms Response DTO → UiEntity
├── model/
│ ├── request/ # Request parameter models placeholder
│ ├── response/
│ │ └── products_response.dart # Raw JSON network DTO with fromJson/toJson
│ └── ui_entity/
│ └── products_ui_entity.dart # Clean UI domain entity
├── presentation/
│ ├── view/
│ │ └── products_screen.dart # BlocProvider + BlocBuilder view with Loader & Error
│ └── widget/ # Custom widgets for this feature
└── repository/
└── products_repository.dart # Bridge between DataSource & Bloc
Generated Structure with RxDart + Provider:
lib/src/products/
├── bloc/
│ └── products_bloc.dart # RxDart BehaviorSubject state emitter
├── data_source/
│ └── products_datasource.dart # ApiClient data layer
├── mapper/
│ └── products_mapper.dart # Transforms Response DTO → UiEntity
├── model/
│ ├── request/ # Request parameter models placeholder
│ ├── response/
│ │ └── products_response.dart # Raw JSON network DTO with fromJson/toJson
│ └── ui_entity/
│ └── products_ui_entity.dart # Clean UI domain entity
├── presentation/
│ ├── view/
│ │ └── products_screen.dart # StreamBuilder view with AppText, Loader & ErrorWidget
│ └── widget/ # Custom widgets for this feature
├── repository/
│ └── products_repository.dart # Bridge between DataSource & Bloc
└── state/
├── products_state.dart # BaseUiState subclass (loading, completed, error)
└── products_provider.dart # Provider DI wire-up
How to consume the generated feature in your app:
-
Riverpod:
import 'package:my_app/src/products/presentation/view/products_screen.dart'; // Navigate directly (Riverpod's ProviderScope wraps MyApp at root): Navigator.push( context, MaterialPageRoute(builder: (_) => const ProductsScreen()), ); -
Signals:
import 'package:my_app/src/products/presentation/view/products_screen.dart'; // Navigate directly (UI uses Watch for fine-grained reactive updates): Navigator.push( context, MaterialPageRoute(builder: (_) => const ProductsScreen()), ); -
MobX:
import 'package:my_app/src/products/presentation/view/products_screen.dart'; // Navigate directly (The screen instantiates its store and listens via Observer): Navigator.push( context, MaterialPageRoute(builder: (_) => const ProductsScreen()), ); -
Redux:
import 'package:my_app/src/products/presentation/view/products_screen.dart'; // Navigate directly (Connected via StoreConnector to the root Redux store): Navigator.push( context, MaterialPageRoute(builder: (_) => const ProductsScreen()), ); -
Cubit:
import 'package:my_app/src/products/presentation/view/products_screen.dart'; // The generated screen automatically sets up its BlocProvider with ProductsCubit: Navigator.push( context, MaterialPageRoute(builder: (_) => const ProductsScreen()), ); -
Pure Provider:
import 'package:my_app/src/products/presentation/view/products_screen.dart'; // The generated screen automatically provides its ProductsProvider: Navigator.push( context, MaterialPageRoute(builder: (_) => const ProductsScreen()), ); -
flutter_bloc:
import 'package:my_app/src/products/presentation/view/products_screen.dart'; // The generated screen automatically initializes its BlocProvider: Navigator.push( context, MaterialPageRoute(builder: (_) => const ProductsScreen()), ); -
GetX:
import 'package:my_app/src/products/presentation/view/products_screen.dart'; import 'package:my_app/src/products/binding/products_binding.dart'; // Direct navigation with binding: Get.to(() => const ProductsScreen(), binding: ProductsBinding()); // Or in your GetPage route definition: GetPage( name: '/products', page: () => const ProductsScreen(), binding: ProductsBinding(), ); -
RxDart + Provider:
import 'package:my_app/src/products/presentation/view/products_screen.dart'; import 'package:my_app/src/products/state/products_provider.dart'; // Wrap the screen in its feature MultiProvider: Navigator.push( context, MaterialPageRoute( builder: (_) => MultiProvider( providers: ProductsProvider.providers, child: const ProductsScreen(), ), ), ); -
ValueNotifier:
import 'package:my_app/src/products/presentation/view/products_screen.dart'; // Navigate directly (The screen manages its ValueNotifier with ValueListenableBuilder): Navigator.push( context, MaterialPageRoute(builder: (_) => const ProductsScreen()), ); -
InheritedWidget:
import 'package:my_app/src/products/presentation/view/products_screen.dart'; // Navigate directly (The screen automatically wraps itself in its scoped InheritedNotifier): Navigator.push( context, MaterialPageRoute(builder: (_) => const ProductsScreen()), ); -
Flutter Hooks:
import 'package:my_app/src/products/presentation/view/products_screen.dart'; // Navigate directly (The screen is a HookWidget managing state via useState & useEffect): Navigator.push( context, MaterialPageRoute(builder: (_) => const ProductsScreen()), ); -
Triple:
import 'package:my_app/src/products/presentation/view/products_screen.dart'; // Navigate directly (The screen manages its Triple Store and listens via ScopedBuilder): Navigator.push( context, MaterialPageRoute(builder: (_) => const ProductsScreen()), ); -
Elementary:
import 'package:my_app/src/products/presentation/view/products_screen.dart'; // Navigate directly (The screen is an ElementaryWidget with its WidgetModel): Navigator.push( context, MaterialPageRoute(builder: (_) => const ProductsScreen()), ); -
Hydrated BLoC:
import 'package:my_app/src/products/presentation/view/products_screen.dart'; // Navigate directly (The screen initializes its HydratedBloc with automatic disk persistence): Navigator.push( context, MaterialPageRoute(builder: (_) => const ProductsScreen()), ); -
StateX:
import 'package:my_app/src/products/presentation/view/products_screen.dart'; // Navigate directly (The screen is a StateX view connected to its StateXController): Navigator.push( context, MaterialPageRoute(builder: (_) => const ProductsScreen()), ); -
Flutter Command:
import 'package:my_app/src/products/presentation/view/products_screen.dart'; // Navigate directly (The screen connects to its ViewModel and listens via CommandBuilder): Navigator.push( context, MaterialPageRoute(builder: (_) => const ProductsScreen()), ); -
Binder:
import 'package:my_app/src/products/presentation/view/products_screen.dart'; // Navigate directly (BinderScope wraps the app at root in main.dart; screen uses context.watch/use): Navigator.push( context, MaterialPageRoute(builder: (_) => const ProductsScreen()), ); -
Fish-Redux:
import 'package:my_app/src/products/presentation/page/products_page.dart'; // Navigate to the built Fish-Redux Component Page: Navigator.push( context, MaterialPageRoute(builder: (_) => ProductsPage().buildPage(null)), );
3. create_screen: Add a Presentation Screen
Adds a new screen widget to an existing or new feature's presentation layer.
Syntax & Options:
flutter_architecture_cli create_screen <screen_name> -f <feature_name> [--fvm]
# Options:
# -f, --feature The target feature folder inside lib/src/ (defaults to screen name)
# --fvm Format generated code using FVM
Examples:
# Create "checkout_screen.dart" inside lib/src/cart/presentation/view/
flutter_architecture_cli create_screen checkout -f cart
# Using dart run
dart run flutter_architecture_cli create_screen profile_settings -f profile
# Using FVM
fvm dart run flutter_architecture_cli create_screen product_details -f products
What it generates:
- Generates
lib/src/<feature>/presentation/view/<screen_name>_screen.dart. - Includes a clean
StatelessWidgetwithScaffold,AppBar,AppText, and a staticrouteName.
4. create_model: Generate UI Entity and Response DTO
Generates both the UI Entity (domain model) and the Response Model (with JSON serialization).
Syntax & Options:
flutter_architecture_cli create_model <model_name> -f <feature_name> [--fvm]
# Options:
# -f, --feature The target feature folder inside lib/src/
# --fvm Format generated code using FVM
Examples:
# Generate product_ui_entity.dart and product_response.dart
flutter_architecture_cli create_model product -f products
# Using dart run
dart run flutter_architecture_cli create_model order -f orders
What it generates:
lib/src/<feature>/model/ui_entity/<model_name>_ui_entity.dart— Clean model for UI consumption.lib/src/<feature>/model/response/<model_name>_response.dart— Network DTO withfromJson()andtoJson()methods.
5. create_datasource: Generate an API Data Source
Creates an API data source class wired with the singleton ApiClient.
Syntax & Options:
flutter_architecture_cli create_datasource <name> -f <feature_name> [--fvm]
# Options:
# -f, --feature The target feature folder inside lib/src/
# --fvm Format generated code using FVM
Examples:
# Generate payment_datasource.dart in lib/src/payment/data_source/
flutter_architecture_cli create_datasource payment -f payment
# Using dart run
dart run flutter_architecture_cli create_datasource order -f orders
What it generates:
lib/src/<feature>/data_source/<name>_datasource.dartwithfinal ApiClient _apiClient = ApiClient.instance;.
6. create_repository: Generate a Repository
Generates a repository class bridging your DataSource and Bloc. It automatically scans your feature directory and links to any existing data sources to avoid manual import wiring.
Syntax & Options:
flutter_architecture_cli create_repository <name> -f <feature_name> [--fvm]
# Options:
# -f, --feature The target feature folder inside lib/src/
# --fvm Format generated code using FVM
Examples:
# Generate cart_repository.dart in lib/src/cart/repository/
flutter_architecture_cli create_repository cart -f cart
# Using dart run
dart run flutter_architecture_cli create_repository order -f orders
What it generates:
lib/src/<feature>/repository/<name>_repository.dart- Automatically discovers and injects the feature's data source:
import 'package:my_app/src/cart/data_source/cart_datasource.dart'; class CartRepository { final CartDataSource _dataSource = CartDataSource(); // Add repository operations }
7. create_service: Generate a Core Singleton Service
Generates a core application service using the thread-safe singleton pattern in
lib/core/services/.
Syntax & Options:
flutter_architecture_cli create_service <service_name> [--fvm]
# Options:
# --fvm Format generated code using FVM
Examples:
# Create auth_service.dart in lib/core/services/
flutter_architecture_cli create_service auth
# Create analytics_service.dart using dart run
dart run flutter_architecture_cli create_service analytics
# Using FVM
fvm dart run flutter_architecture_cli create_service notification
What it generates:
lib/core/services/<service_name>_service.dart:
class AuthService {
static final AuthService _instance = AuthService._internal();
factory AuthService() => _instance;
AuthService._internal();
Future<void> init() async {
// Service initialization logic
}
}
8. change_bundle_id: Rename Package Name and Bundle ID
Safely updates the Android application ID/namespace and iOS bundle identifier across the entire project in one step.
Syntax & Options:
flutter_architecture_cli change_bundle_id <new_bundle_id>
Examples:
# Global CLI
flutter_architecture_cli change_bundle_id com.mycompany.shopapp
# As Dev Dependency (Standard)
dart run flutter_architecture_cli change_bundle_id com.mycompany.shopapp
# As Dev Dependency (FVM)
fvm dart run flutter_architecture_cli change_bundle_id com.mycompany.shopapp
What it updates automatically:
- Android:
android/app/build.gradle(applicationId,namespace).android/app/build.gradle.kts(Kotlin DSL support).android/app/src/main/AndroidManifest.xml(package="...").- Moves
MainActivity.ktorMainActivity.javato the new package directory structure and cleans up old empty folders.
- iOS:
ios/Runner.xcodeproj/project.pbxproj(PRODUCT_BUNDLE_IDENTIFIER).
Architecture Flow
The generated structure focuses on a single directional clean architecture data flow:
- DataSource: Fetches raw JSON data using
ApiClientand parses it into a Response DTO (model/response/). - Mapper: Inherits from
BaseMapperto transform the Response DTO into a clean UI Entity (model/ui_entity/). - Repository: Requests data from
DataSourceand runs the mapped results up to the state management layer. - State Management:
- ValueNotifier: Native zero-dependency reactive state with
ValueNotifier<BaseUiState>. - InheritedWidget: Native zero-dependency scoped state tree with
InheritedNotifierandChangeNotifier. - Flutter Hooks: Composable state hooks using
useStateanduseEffectwith zero boilerplate. - Triple: Clean MVI state management using
Store<T>(State,Loading, andErrorstreams). - Elementary: Production-grade MVVM using
ElementaryModelfor business logic andWidgetModelfor UI coordination. - Hydrated BLoC: Automatic persistent state to disk using
HydratedBloc<Event, State>and JSON serialization. - StateX: Clean controller-based state using
StateXControllerandStateX. - Flutter Command: Asynchronous reactive command pattern using
Command.createAsyncandCommandBuilder. - Binder: Decoupled scoped state management with
StateRef<T>,Logic, andBinderScope. - Fish-Redux: Componentized Redux with
Page,Effect,Action, and pureReducer. - Riverpod: Manages reactive state with
StateNotifierand exposes it viaStateNotifierProvider. - Signals: Uses fine-grained reactive
signal<BaseUiState>updated directly from asynchronous repository calls. - MobX: Stores observable state using
@observableand mutations inside@action/runInAction. - Redux: Dispatches async thunk actions that query repositories and emit state changes through pure reducers.
- Cubit: Emits
BaseUiStatedirectly via method calls without boilerplate event classes. - Pure Provider: Extends
ChangeNotifierto holdBaseUiStateand notify listeners. - flutter_bloc: Handles incoming
Events and emits state extendingBaseUiStateviaBloc<Event, State>. - GetX: Manages reactive
BaseUiStatevia.obsinsideGetxController, with dependency injection handled viaBindings. - RxDart + Provider: Converts repository streams into
BaseUiState(Loading → Completed/Error) emitted viaBehaviorSubject.
- ValueNotifier: Native zero-dependency reactive state with
- Presentation (View):
- ValueNotifier: Uses standard
ValueListenableBuilderto rebuild precisely when values change. - InheritedWidget: Listens to scoped ancestor notifications via
InheritedNotifier/context.dependOnInheritedWidgetOfExactType. - Flutter Hooks: Uses
HookWidget/HookConsumerWidgetto consume hooks directly inbuild(). - Triple: Uses
ScopedBuilder<Store, State>to automatically render loading, error, and state screens. - Elementary: Uses
ElementaryWidget<IWidgetModel>for clean, testable UI binding. - Hydrated BLoC: Uses
BlocProviderandBlocBuilderwith auto-hydrated cached state. - StateX: Uses
StateX<T>with fine-grained controller event handlers. - Flutter Command: Uses
CommandBuilder<Input, Output>to display execution status, spinner, and results. - Binder: Uses
context.watch(stateRef)andcontext.use(logicRef)insideBinderScope. - Fish-Redux: Builds UI via component
Viewfunctions driven by dispatched actions. - Riverpod: Uses
ConsumerStatefulWidgetorConsumerWidgetwithref.watchto re-render UI. - Signals: Automatically tracks dependencies and rebuilds only necessary UI components using
Watch(...). - MobX: Uses
Observer(builder: ...)to reactively re-render UI when observables mutate. - Redux: Connects to the global store using
StoreConnector<AppState, VM>with ViewModel selectors. - Cubit: Rebuilds UI cleanly on state changes using
BlocProviderandBlocBuilder. - Pure Provider: Rebuilds listening widgets using
Consumer<T>orcontext.watch<T>(). - flutter_bloc: Rebuilds on state transitions using
BlocProviderandBlocBuilder. - GetX: Automatically reacts to state changes using
GetViewandObx(() => ...). - RxDart: Listens to the Bloc subjects using
StreamBuilderand renders loading, success, or error screens automatically.
- ValueNotifier: Uses standard
Form Validation Helper
Every scaffolded application includes lib/core/utils/validators.dart, providing a robust,
pre-built validation engine. It integrates seamlessly with AppTextField and Flutter's standard
TextFormField:
import 'package:my_app/core/utils/validators.dart';
// 1. Direct validation functions
AppTextField
(
labelText: 'Email',
validator: Validators.email,
)
// 2. Custom error messages
AppTextField(
labelText: 'Username',
validator: (val) => Validators.required(val, 'Username is required'),
)
// 3. Length constraints
AppTextField(
labelText: 'Bio',
validator: (val) => Validators.maxLength(val, 150),
)
// 4. Password validation (with optional number & special character checks)
AppTextField(
labelText: 'Password',
isPassword: true,
validator: (val) => Validators.password(
val,
minLength: 8,
requireNumber: true,
requireSpecialChar: true,
),
)
// 5. Password Confirmation Matching
AppTextField(
labelText: 'Confirm Password',
isPassword: true,
validator: (val) => Validators.match(val, passwordController.text, 'Passwords do not match'),
)
// 6. Chained validation rules (executes sequentially)
AppTextField(
labelText: 'Work Email',
validator: Validators.compose([
Validators.required,
Validators.email,
]),
)
Available Validator Methods:
Validators.required(value, [message])— Validates non-empty input.Validators.email(value, [message])— Validates RFC-compliant email address format.Validators.phone(value, [message])— Validates 10-12 digit phone numbers.Validators.minLength(value, min, [message])— Enforces minimum character length.Validators.maxLength(value, max, [message])— Enforces maximum character length limit.Validators.password(value, {minLength, requireNumber, requireSpecialChar, message})— Validates password complexity.Validators.match(value, target, [message])— Validates that two inputs match (e.g. password confirmation).Validators.numeric(value, [message])— Ensures input contains only numeric digits.Validators.url(value, [message])— Ensures valid HTTP/HTTPS URL syntax.Validators.compose([...])— Sequentially executes a list of validator functions and returns the first error encountered.
Roadmap and Future Goals
We support the following 19 popular state management architectures:
xValueNotifier: Native zero-dependency reactive state withValueNotifierandValueListenableBuilder.xInheritedWidget: Native zero-dependency scoped tree state withInheritedNotifierandChangeNotifier.xFlutter Hooks: Functional reactive widget hooks withflutter_hooks.xTriple: Segmented MVI architecture withflutter_triple(State,Loading,Error).xElementary: Production-grade MVVM withelementaryandelementary_helper.xHydrated BLoC: Automatically persisted BLoC state withhydrated_bloc.xStateX: Clean controller architecture withstate_extended.xFlutter Command: Reactive command pattern withflutter_command.xBinder: Scoped modular state management withbinder.xFish-Redux: Componentized Redux architecture withflying_redux.xflutter_bloc: Support for Bloc/Event/State architecture withBlocBuilderandBlocProvider.xGetX: Support for reactive controller, bindings, andObx/GetView.xCubit: Support for simplified method-based BLoC architecture withCubit<State>andBlocBuilder.xPure Provider: Support for cleanChangeNotifierProviderandConsumerarchitecture.xRiverpod: Support for modern reactive state management withStateNotifierProviderandConsumerStatefulWidget.xSignals: Support for fine-grained reactive programming withsignals_flutter.xMobX: Support forObservableList,runInAction, andObserverwithout code generation.xRedux: Support for centralizedStore<AppState>,StoreProvider,StoreConnector, and async thunks.xRxDart + Provider: Support for reactive stream pipelines withBehaviorSubjectandBaseBloc.Custom templates: Ability to load user-defined boilerplate structures.
Contributing
Contributions are welcome! If you want to suggest an improvement, report a bug, or add new command options:
- Fork the repository:
https://github.com/Dharti1623/flutter_architecture_cli - Create your feature branch:
git checkout -b feature/amazing-feature - Commit your changes:
git commit -m 'Add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request detailing your changes.
Support and Donations
If this CLI generator saved you time and made your Flutter development easier, consider supporting the project:
- ☕ Buy Me A Coffee: https://buymeacoffee.com/dhartichauhan
- ⭐ Star the Repository: Show your support by giving our GitHub repository a star!
Libraries
- flutter_architecture_cli
- Flutter Architecture CLI Package.