Skip to main content

MVVM Architecture

easy_init_cli now supports MVVM (Model-View-ViewModel) architecture, providing a clean separation between the user interface and the business logic.

Feature-Wise Separation

The architecture organizes code by features rather than technical layers. Each feature is a self-contained module with its own data, models, viewmodels, and views.

Advantages

  • Modularity: Features are independent and can be developed, tested, and maintained in isolation
  • Scalability: Easy to add new features without affecting existing ones
  • Team Collaboration: Multiple developers can work on different features simultaneously without conflicts
  • Code Reusability: Shared utilities and widgets are placed in common/ for cross-feature use
  • Maintainability: Changes to one feature don't ripple through the entire codebase
  • Testability: Each feature can be unit tested independently with clear boundaries

Project Structure

lib/
├── app.dart # Main application widget
├── app_runner.dart # Application runner configuration
├── main.dart # Application entry point
├── common/ # Reusable components, utilities, and shared logic across features
│ ├── ui_utils/ # Common UI utilities (e.g., SnackBars)
│ └── widgets/ # Common UI components (GenericButton, CustomTextField, Loading, etc.)
├── core/ # Core functionalities, infrastructure, and cross-cutting concerns
│ ├── api_endpoints/ # API endpoint definitions
│ ├── config/ # Application configuration (FlavorConfig)
│ ├── dependency_injection/ # Dependency injection setup (GetIt, Injectable)
│ │ ├── config/ # DI configuration files
│ │ └── modules/ # DI modules (e.g., DioModule)
│ ├── extensions/ # Dart extensions (String, Date, Number, Theme, Navigation)
│ ├── failures/ # Custom failure classes for error handling
│ ├── network/ # Network client and handling (Dio configuration)
│ ├── routes/ # Application routing definitions (AutoRoute)
│ ├── services/ # Core services (empty for now)
│ └── theme/ # Application theme and styling
│ ├── typography/ # Typography system (TextStyles, FontWeights)
│ ├── app_colors.dart # Color palette definitions
│ ├── app_theme.dart # Theme configuration
│ └── theme_service.dart # Theme management service
└── features/ # Feature-specific modules, each following MVVM architecture
└── <feature_name>/
├── data/ # Data layer (repositories implementation, data sources)
│ ├── data_sources/ # Remote and local data sources
│ └── repositories/ # Repository implementations
├── models/ # Data models (DTOs, domain models)
├── view_model/ # ViewModels for state management (using ChangeNotifier or similar)
└── view/ # View layer (UI components)
├── screens/ # Screens/Pages
└── widgets/ # UI components specific to the feature

Note: While this structure follows MVVM principles, it also incorporates elements of Clean Architecture to ensure scalability and maintainability.

AI Documentation

The project includes an /ai_docs folder in the root directory containing curated guidelines for AI-assisted development:

  • api_flow_guide.md - Comprehensive guide on API call flow, error handling patterns, and network layer best practices
  • styling_guide.md - Styling conventions, theme usage, widget patterns, and UI consistency guidelines

These guides enable vibe coding - AI-powered development that maintains consistency with your project's architecture and conventions. When using AI assistants, reference these documents to ensure generated code follows your established patterns.

Core Packages

The MVVM structure uses the following packages to maintain clean architecture and efficient state management:

Dependencies

  • provider - State management and dependency injection for ViewModels
  • injectable - Code generation for dependency injection setup
  • freezed_annotation - Annotations for generating immutable models and unions
  • get_it - Service locator for dependency injection
  • dio - HTTP client for API requests
  • intl - Internationalization and localization support
  • go_router - Declarative routing solution

Dev Dependencies

  • build_runner - Code generation tool runner
  • freezed - Code generator for immutable classes and unions
  • injectable_generator - Code generator for injectable dependency injection
  • mocktail - Mocking library for unit tests

These packages work together to provide:

  • Dependency Injection: get_it and injectable handle service registration and retrieval
  • State Management: provider manages ViewModels and UI state
  • Data Models: freezed generates immutable models with copyWith, equality, and toString
  • Networking: dio provides a robust HTTP client with interceptors
  • Routing: go_router enables type-safe, declarative navigation
  • Testing: mocktail allows easy mocking for unit tests