Flutter Architecture & Architect CLI (Plugin)

pub package License: MIT Platform Support

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

You can use flutter_architecture_cli in two convenient ways:

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.dart
lib/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

  1. Smart Auto-Detection:
    • Missing Global Flutter: If flutter is missing from your system PATH but fvm is installed, the CLI automatically detects FVM and switches to fvm flutter without requiring any manual flags.
    • Workspace Detection: If an .fvm/ directory or .fvmrc file exists in your workspace, FVM is automatically preferred for all operations.
  2. Explicit Flags (--fvm and --fvm-version):
    • Pass --fvm to 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
      
  3. Automated IDE & Git Configuration:
    • Automatically adds .fvm/flutter_sdk to the generated .gitignore.
    • Automatically creates .vscode/settings.json with "dart.flutterSdkPath": ".fvm/flutter_sdk" so VS Code immediately binds the correct Flutter SDK.
  4. All Subcommands Support FVM:
    • When running feature, screen, or model generation inside an FVM project, code formatting automatically uses fvm dart format.

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_feature automatically inspect your project's pubspec.yaml and feature folders to detect any of the 19 architectures and generate matching code with 0 configuration.
  • Centralized Networking: Custom ApiClient powered by Dio with automatic logging, secure token handling, and robust exception-handling interceptors.
  • Common Widget Toolkit: Reusable components such as AppText, AppImage, AppTextField, AppButton, AppLoader, AppShimmer, and AppNetworkStatusWidget.
  • Built-in Validation Engine: Comprehensive Validators utility covering required, email, phone, minLength, maxLength, password, numeric, url, and compose(...) 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.dart
base_ui_state.dart
const MyApp() ValueListenableBuilder<UserState>
InheritedWidget (--inheritedwidget or [11]) (Zero dependencies - Pure Flutter) base_mapper.dart
base_ui_state.dart
const MyApp() InheritedNotifier<UserController>
Flutter Hooks (--hooks or [12]) flutter_hooks: ^0.20.5 base_mapper.dart
base_ui_state.dart
const MyApp() HookWidget / useState / useEffect
Triple (--triple or [13]) flutter_triple: ^3.0.0 base_mapper.dart
base_ui_state.dart
const MyApp() ScopedBuilder<UserStore, List<UserUiEntity>>
Elementary (--elementary or [14]) elementary: ^3.2.1
elementary_helper: ^1.1.0
base_mapper.dart
base_ui_state.dart
const MyApp() ElementaryWidget<IUserWidgetModel>
Hydrated BLoC (--hydrated_bloc or [15]) flutter_bloc: ^8.1.6
hydrated_bloc: ^9.1.5
path_provider: ^2.1.2
base_mapper.dart
base_ui_state.dart
MultiRepositoryProvider BlocProvider + BlocBuilder (persisted to disk)
StateX (--statex or [16]) state_extended: ^7.6.0 base_mapper.dart
base_ui_state.dart
const MyApp() StateX<UserScreen> + StateXController
Flutter Command (--command or [17]) flutter_command: ^7.2.2 base_mapper.dart
base_ui_state.dart
const MyApp() CommandBuilder<void, List<UserUiEntity>>
Binder (--binder or [18]) binder: ^0.4.0 base_mapper.dart
base_ui_state.dart
BinderScope(child: MyApp()) context.watch(userViewStateRef) / context.use
Fish-Redux (--fish_redux or [19]) flying_redux: ^0.1.0 base_mapper.dart
base_ui_state.dart
UserPage().buildPage(null) Page + Effect + Reducer + View
Riverpod (--riverpod or [6]) flutter_riverpod: ^2.5.1 base_mapper.dart
base_ui_state.dart
ProviderScope(child: MyApp()) ConsumerStatefulWidget / ref.watch
Signals (--signals or [7]) signals_flutter: ^5.5.0 base_mapper.dart
base_ui_state.dart
const MyApp() Watch((context) => ...)
MobX (--mobx or [8]) mobx: ^2.3.0
flutter_mobx: ^2.2.1
base_mapper.dart
base_ui_state.dart
const MyApp() Observer(builder: ...) (zero build_runner)
Redux (--redux or [9]) redux: ^5.0.0
flutter_redux: ^0.10.0
base_mapper.dart
base_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.dart
base_ui_state.dart
MultiRepositoryProvider BlocProvider + BlocBuilder
Pure Provider (--provider or [5]) provider: ^6.1.5+1 base_mapper.dart
base_ui_state.dart
MultiProvider ChangeNotifierProvider + Consumer
flutter_bloc (--bloc or [2]) flutter_bloc: ^8.1.6 base_mapper.dart
base_ui_state.dart
MultiRepositoryProvider BlocProvider + BlocBuilder
GetX (--getx or [3]) get: ^4.6.6 base_mapper.dart
base_ui_state.dart
GetMaterialApp GetView<T> + Obx(() => ...)
RxDart + Provider (--state rxdart or [1]) rxdart: ^0.28.0
provider: ^6.1.5+1
base_bloc.dart
base_mapper.dart
base_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 (or fvm 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.dart with 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 ValueNotifier and ValueListenableBuilder.
    • InheritedWidget: Zero external state management dependencies (pure Flutter SDK). Uses InheritedNotifier and ChangeNotifier.
    • Flutter Hooks: Adds flutter_hooks: ^0.20.5. Uses HookWidget, useState, and useEffect.
    • Triple: Adds flutter_triple: ^3.0.0. Uses Store<T> and ScopedBuilder.
    • Elementary: Adds elementary: ^3.2.1 and elementary_helper: ^1.1.0. Uses ElementaryModel and WidgetModel.
    • Hydrated BLoC: Adds hydrated_bloc: ^9.1.5, flutter_bloc: ^8.1.6, and path_provider: ^2.1.2. Automatically persists BLoC state to disk.
    • StateX: Adds state_extended: ^7.6.0. Uses StateXController and StateX.
    • Flutter Command: Adds flutter_command: ^7.2.2. Uses Command and CommandBuilder.
    • Binder: Adds binder: ^0.4.0. Uses StateRef, Logic, and BinderScope.
    • Fish-Redux: Adds flying_redux: ^0.1.0. Uses Page, Effect, Action, and Reducer.
    • Riverpod: Adds only flutter_riverpod: ^2.5.1. Uses ProviderScope and ConsumerStatefulWidget.
    • Signals: Adds only signals_flutter: ^5.5.0. Uses fine-grained signal() and Watch().
    • MobX: Adds only mobx: ^2.3.0 and flutter_mobx: ^2.2.1. Zero build_runner required.
    • Redux: Adds only redux: ^5.0.0 and flutter_redux: ^0.10.0. Uses StoreProvider and StoreConnector.
    • Cubit: Adds only flutter_bloc: ^8.1.6. Uses MultiRepositoryProvider.
    • Pure Provider: Adds only provider: ^6.1.5+1. Uses MultiProvider.
    • flutter_bloc: Adds only flutter_bloc: ^8.1.6. Uses MultiRepositoryProvider.
    • GetX: Adds only get: ^4.6.6. Uses GetX Bindings and Get.put.
    • RxDart + Provider: Adds rxdart: ^0.28.0 and provider: ^6.1.5+1.
  • A functional dummy users feature showcasing the full DataSource + Repository + Mapper + UI Entity data flow.
  • A passing test/widget_test.dart smoke test customized for your state management.
  • Automatically adds flutter_architecture_cli: ^1.0.6 to dev_dependencies inside pubspec.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 Hooks
  • flutter_triple: → Triple
  • elementary: → Elementary
  • hydrated_bloc: → Hydrated BLoC
  • state_extended: → StateX
  • flutter_command: → Flutter Command
  • binder: → Binder
  • flying_redux: → Fish-Redux
  • signals_flutter: → Signals
  • flutter_riverpod: → Riverpod
  • mobx: → MobX
  • redux: → Redux
  • get: → GetX
  • flutter_bloc: → checks for cubit/ directories to generate Cubit, or defaults to BLoC
  • provider: (without rxdart:) → 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 StatelessWidget with Scaffold, AppBar, AppText, and a static routeName.

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:

  1. lib/src/<feature>/model/ui_entity/<model_name>_ui_entity.dart — Clean model for UI consumption.
  2. lib/src/<feature>/model/response/<model_name>_response.dart — Network DTO with fromJson() and toJson() 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.dart with final 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.kt or MainActivity.java to 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:

  1. DataSource: Fetches raw JSON data using ApiClient and parses it into a Response DTO (model/response/).
  2. Mapper: Inherits from BaseMapper to transform the Response DTO into a clean UI Entity (model/ui_entity/).
  3. Repository: Requests data from DataSource and runs the mapped results up to the state management layer.
  4. State Management:
    • ValueNotifier: Native zero-dependency reactive state with ValueNotifier<BaseUiState>.
    • InheritedWidget: Native zero-dependency scoped state tree with InheritedNotifier and ChangeNotifier.
    • Flutter Hooks: Composable state hooks using useState and useEffect with zero boilerplate.
    • Triple: Clean MVI state management using Store<T> (State, Loading, and Error streams).
    • Elementary: Production-grade MVVM using ElementaryModel for business logic and WidgetModel for UI coordination.
    • Hydrated BLoC: Automatic persistent state to disk using HydratedBloc<Event, State> and JSON serialization.
    • StateX: Clean controller-based state using StateXController and StateX.
    • Flutter Command: Asynchronous reactive command pattern using Command.createAsync and CommandBuilder.
    • Binder: Decoupled scoped state management with StateRef<T>, Logic, and BinderScope.
    • Fish-Redux: Componentized Redux with Page, Effect, Action, and pure Reducer.
    • Riverpod: Manages reactive state with StateNotifier and exposes it via StateNotifierProvider.
    • Signals: Uses fine-grained reactive signal<BaseUiState> updated directly from asynchronous repository calls.
    • MobX: Stores observable state using @observable and mutations inside @action / runInAction.
    • Redux: Dispatches async thunk actions that query repositories and emit state changes through pure reducers.
    • Cubit: Emits BaseUiState directly via method calls without boilerplate event classes.
    • Pure Provider: Extends ChangeNotifier to hold BaseUiState and notify listeners.
    • flutter_bloc: Handles incoming Events and emits state extending BaseUiState via Bloc<Event, State>.
    • GetX: Manages reactive BaseUiState via .obs inside GetxController, with dependency injection handled via Bindings.
    • RxDart + Provider: Converts repository streams into BaseUiState (Loading → Completed/Error) emitted via BehaviorSubject.
  5. Presentation (View):
    • ValueNotifier: Uses standard ValueListenableBuilder to rebuild precisely when values change.
    • InheritedWidget: Listens to scoped ancestor notifications via InheritedNotifier / context.dependOnInheritedWidgetOfExactType.
    • Flutter Hooks: Uses HookWidget / HookConsumerWidget to consume hooks directly in build().
    • 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 BlocProvider and BlocBuilder with 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) and context.use(logicRef) inside BinderScope.
    • Fish-Redux: Builds UI via component View functions driven by dispatched actions.
    • Riverpod: Uses ConsumerStatefulWidget or ConsumerWidget with ref.watch to 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 BlocProvider and BlocBuilder.
    • Pure Provider: Rebuilds listening widgets using Consumer<T> or context.watch<T>().
    • flutter_bloc: Rebuilds on state transitions using BlocProvider and BlocBuilder.
    • GetX: Automatically reacts to state changes using GetView and Obx(() => ...).
    • RxDart: Listens to the Bloc subjects using StreamBuilder and renders loading, success, or error screens automatically.

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:

  • x ValueNotifier: Native zero-dependency reactive state with ValueNotifier and ValueListenableBuilder.
  • x InheritedWidget: Native zero-dependency scoped tree state with InheritedNotifier and ChangeNotifier.
  • x Flutter Hooks: Functional reactive widget hooks with flutter_hooks.
  • x Triple: Segmented MVI architecture with flutter_triple (State, Loading, Error).
  • x Elementary: Production-grade MVVM with elementary and elementary_helper.
  • x Hydrated BLoC: Automatically persisted BLoC state with hydrated_bloc.
  • x StateX: Clean controller architecture with state_extended.
  • x Flutter Command: Reactive command pattern with flutter_command.
  • x Binder: Scoped modular state management with binder.
  • x Fish-Redux: Componentized Redux architecture with flying_redux.
  • x flutter_bloc: Support for Bloc/Event/State architecture with BlocBuilder and BlocProvider.
  • x GetX: Support for reactive controller, bindings, and Obx/GetView.
  • x Cubit: Support for simplified method-based BLoC architecture with Cubit<State> and BlocBuilder.
  • x Pure Provider: Support for clean ChangeNotifierProvider and Consumer architecture.
  • x Riverpod: Support for modern reactive state management with StateNotifierProvider and ConsumerStatefulWidget.
  • x Signals: Support for fine-grained reactive programming with signals_flutter.
  • x MobX: Support for ObservableList, runInAction, and Observer without code generation.
  • x Redux: Support for centralized Store<AppState>, StoreProvider, StoreConnector, and async thunks.
  • x RxDart + Provider: Support for reactive stream pipelines with BehaviorSubject and BaseBloc.
  • 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:

  1. Fork the repository: https://github.com/Dharti1623/flutter_architecture_cli
  2. Create your feature branch: git checkout -b feature/amazing-feature
  3. Commit your changes: git commit -m 'Add amazing feature'
  4. Push to the branch: git push origin feature/amazing-feature
  5. 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:

Libraries

flutter_architecture_cli
Flutter Architecture CLI Package.