Flutter Architecture
Overview
Provides architectural guidance and best practices for building scalable Flutter applications using MVVM pattern, layered architecture, and recommended design patterns from the Flutter team.
Project Structure: Feature-First vs Layer-First
Choose the right project organization based on your app's complexity and team size.
Feature-First (Recommended for teams)
Organize code by business features:
lib/
├── features/
│ ├── auth/
│ │ ├── data/
│ │ ├── domain/
│ │ └── presentation/
│ ├── todos/
│ │ ├── data/
│ │ ├── domain/
│ │ └── presentation/
│ └── settings/
│ ├── data/
│ ├── domain/
│ └── presentation/
├── shared/
│ ├── core/
│ ├── data/
│ └── ui/
└── main.dart
When to use:
- Medium to large apps (10+ features)
- Team development (2+ developers)
- Frequently adding/removing features
- Complex business logic
Benefits:
- Features are self-contained units
- Easy to add/remove entire features
- Clear feature boundaries
- Reduced merge conflicts
- Teams work independently on features
See Feature-First Guide for complete implementation details.
Layer-First (Traditional)
Organize code by architectural layers:
lib/
├── data/
│ ├── repositories/
│ ├── services/
│ └── models/
├── domain/
│ ├── use-cases/
│ └── entities/
├── presentation/
│ ├── views/
│ └── viewmodels/
└── shared/
When to use:
- Small to medium apps
- Few features (<10)
- Solo developers or small teams
- Simple business logic
Benefits:
- Clear separation by layer
- Easy to find components by type
- Less nesting
Quick Start
Start with these core concepts:
- Separation of concerns - Split app into UI and Data layers
- MVVM pattern - Use Views, ViewModels, Repositories, and Services
- Single source of truth - Repositories hold the authoritative data
- Unidirectional data flow - State flows from data → logic → UI
For detailed concepts, see Concepts.
Architecture Layers
Flutter apps should be structured in layers:
- UI Layer: Views (widgets) and ViewModels (UI logic)
- Data Layer: Repositories (SSOT) and Services (data sources)
- Domain Layer (optional): Use-cases for complex business logic
See Layers Guide for detailed layer responsibilities and interactions.
Core Components
Views
- Compose widgets for UI presentation
- Contain minimal logic (animations, simple conditionals, routing)
- Receive data from ViewModels
- Pass events via ViewModel commands
ViewModels
- Transform repository data into UI state
- Manage UI state and commands
- Handle business logic for UI interactions
- Expose state as streams or change notifiers
Repositories
- Single source of truth for data types
- Aggregate data from services
- Handle caching, error handling, retry logic
- Expose data as domain models
Services
- Wrap external data sources (APIs, databases, platform APIs)
- Stateless data access layer
- One service per data source
Design Patterns
Common patterns for robust Flutter apps:
- Command Pattern - Encapsulate actions with Result handling
- Result Type - Type-safe error handling
- Repository Pattern - Abstraction over data sources
- Offline-First - Optimistic UI updates with sync
See Design Patterns for implementation details.
When to Use This Skill
Use this skill when:
- Designing or refactoring Flutter app architecture
- Choosing between feature-first and layer-first project structure
- Implementing MVVM pattern in Flutter
- Creating scalable app structure for teams
- Adding new features to existing architecture
- Applying best practices and design patterns
Resources
references/
- concepts.md - Core architectural principles (separation of concerns, SSOT, UDF)
- feature-first.md - Feature-first project organization and best practices
- mvvm.md - MVVM pattern implementation in Flutter
- layers.md - Detailed layer responsibilities and interactions
- design-patterns.md - Common patterns and implementations
assets/
- command.dart - Command pattern template for encapsulating actions
- result.dart - Result type for safe error handling
- examples/ - Code examples showing architecture in practice