flutter-apply-architecture-best-practices
Use when structuring Flutter application layers across data, domain, and presentation using Clean Architecture and BLoC.
Skill by dhruvanbhalara
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/dhruvanbhalara-flutter-apply-architecture-best-practices
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: presentations, data
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md and code. Checked Oct 26, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/flutter-apply-architecture-best-practices
What's inside
- Skill name
flutter-apply-architecture-best-practices- Description
- Use when structuring Flutter application layers across data, domain, and presentation using Clean Architecture and BLoC.
- License
- MIT
- Metadata
- category: architecture · languages: dart · platforms: flutter
- Instructions
- 130 lines in SKILL.md · view on GitHub
Files (1)
- SKILL.md
SKILL.md (first lines)
# Technology Stack
- Flutter for cross-platform development
- Dart as the primary programming language
- bloc for state management
- injectable for dependency injection
- Dart Mappable for immutable data models
- Dio for HTTP networking
- isar for local database
- Firebase for backend services
# Clean Architecture
- **Domain Purity**: The `domain` layer must be pure Dart. NO `package:flutter` imports.
- **Layer Dependency**: `Presentation -> Domain <- Data`. Data layer implements Domain interfaces.
- **Feature-First 2.0**: Enforce strict separation of `DataSources` (External/Raw) vs `Repositories` (Domain abstraction).
## Directory Structure
- Organize code according to feature-based Clean Architecture pattern (`featureA/bloc`, `featureA/models`, `featureA/views`)
- Place cross-feature components in the `core` directory
- Group shared widgets in `core/views/widgets` by type
## Three-Layer Data Model Pattern
1. **API Layer (ItemApiModel)**
- Represents the raw data structure as received from the server
- Contains all fields provided by the API
- Should match the API contract exactly
2. **Domain Layer (Item)**
- Represents the internal data model
- Contains only the fields necessary for business logic
- Strips out unnecessary API fields
3. **UI Layer (ItemUiState)**
- Represents the data model optimized for UI rendering
- Contains parsed and formatted data ready for display
- Handles all UI-specific transformations
## Data Model Rules
- Use Dart Mappable for defining immutable UI states
- Each layer should have its own type definition
- The UI layer should use the UI state data models, never directly the domain model or the API model
- The UI state model should be derived from the domain model, not the API model
- The domain model should be derived from the API model, not the UI state model
## Repository & DataSource Pattern
- Repositories orchestrate between data sources (return Domain Model)
- Data sources access raw data (return API Model)
- The repository should be the source of truth, and it returns the domain model
- DataSources MUST only contain raw SDK/API calls. No mapping or business logic.
- No direct backend SDK/API calls outside DataSources
## Data Flow
```
UI Event → BLoC (emit Loading) → Repository → DataSource (API/SDK)
↓
Response → Repository (map to Domain Entity) → BLoC (emit Success/Error) → UI
```
# Dart 3 Language Features
- **Sealed Classes**: Use `sealed class` for domain failures to enable exhaustive pattern matching across layers.
- **Records**: Use records for lightweight multi-value returns where defining a full class is overkill (e.g., `(String name, int age)`).
- **If-Case Pattern**: Prefer `if (value case final v?)` over `if (value != null)` for null checking with binding.
- **Class Modifiers**: Use `final`, `interface`, `base`, and `sealed` class modifiers to express API intent.
# Error Handling
- **Functional Error Handling**: Use `Either<Failure, T>` or `Result<T>` sealed classes. NEVER throw exceptions across layer boundaries.
- **Pattern Matching**: Exhaustively handle all sealed class states using Dart 3.x `switch` expressions in UI and BLoCs.
- Throw errors when needed, and catch them at appropriate boundaries
- Log errors with context
- Present user-friendly error messages in the UI
- Avoid silent failures; always handle or propagate errors
# Platform Channels & Native Integration
- Use `MethodChannel` for one-off calls to native code (e.g., reading device info, triggering native APIs)
- Use `EventChannel` for continuous streams from native to Flutter (e.g., sensor data, connectivity changes)
- Place all channel code in a dedicated `platform/` directory within the relevant feature
- Define channel names as constants: `static const channel = MethodChannel('com.app.feature/method')`
- Wrap all channel calls in a DataSource: never call `MethodChannel` directly from BLoC or UI
- Handle `MissingPluginException` gracefully for platforms that don't implement the channel
- Use `defaultTargetPlatform` checks to guard platform-specific behavior
## FFI (Foreign Function Interface)
- Use `dart:ffi` for performance-critical native C/C++ code
- Define bindings in a separate class with clear documentation
- Prefer Federated Plugins when sharing native code across multiple packages
## Platform-Specific Code
- Use `Platform.isAndroid` / `Platform.isIOS` for runtime checks (import `dart:io`)
- For web, use `kIsWeb` from `package:flutter/foundation.dart`
- Prefer adaptive widgets (`Switch.adaptive`, `Slider.adaptive`) over manual platform checks where possible
# Coding Guidelines & Maintenance
- **Conciseness**: Keep files < 300 lines and functions < 50 lines. Keep classes to < 10 public methods.
- **Strong Typing**: STRICTLY prohibit `dynamic`. Use `Object?` or explicit types.
- **Guard Clauses**: Use early returns (e.g., `if (user == null) return;`) to reduce nesting and improve readability.
- **Disposable Lifecycle**: `TextEditingController`, `ScrollController`, `FocusNode`, `StreamSubscription`, `AnimationController`, etc., MUST be `late` initialized in `initState()` and disposed in `dispose()`.
- **No Print Statements**: STRICTLY prohibit `print()`. Use `AppLogger` for all logging.
- **Reuse**: Extract widgets or code blocks used multiple times into `core/views/widgets` or utilities.
# Documentation
- **Why, not What**: Comments MUST explain the rationale (intent), not what the code does.
- **Public API**: Document public classes and methods with triple-slash (`///`) comments.
- **History**: Do NOT include version history or "fixed by" comments. Git is the source of truth.
## Workflow: Implementing a New FeatureFrom dhruvanbhalara/skills, MIT.
More from dhruvanbhalara/skills
- 0.611score
dart-fix-runtime-errors
dhruvanbhalara
Use when diagnosing runtime failures, type cast errors, null check violations, or unhandled asynchronous exceptions in Dart.
SkillBFreshness: B★ 30Claude Code +9 - 0.611score
dart-build-cli-app
dhruvanbhalara
Use when creating Dart command-line tools, parsing CLI arguments with args, handling exit codes, or managing child processes.
SkillBFreshness: B★ 30Claude Code +9 - 0.611score
dart-logic-patterns
dhruvanbhalara
Use when organizing business logic, implementing algorithmic workflows, or applying Dart data structures and pattern matching.
SkillBFreshness: B★ 30Claude Code +9 - 0.611score
dart-memory
dhruvanbhalara
Use when troubleshooting memory leaks, optimizing garbage collection overhead, or disposing streams and listeners in Dart.
SkillBFreshness: B★ 30Claude Code +9 - 0.611score
flutter-add-widget-preview
dhruvanbhalara
Use when configuring widget previews in Flutter development, testing visual component variations, or isolating widget UI states.
SkillBFreshness: B★ 30Claude Code +9 - 0.611score
flutter-bloc
dhruvanbhalara
Use when implementing state management with sealed BLoC classes, registering dependency injection with injectable, or setting up GoRouter listeners.
SkillBFreshness: B★ 30Claude Code +9 - 0.611score
flutter-bloc-forms
dhruvanbhalara
Use when managing complex form state, synchronous and asynchronous input validation, or form submission transitions in BLoC.
SkillBFreshness: B★ 30Claude Code +9 - 0.611score
flutter-config
dhruvanbhalara
Use when configuring build flavors, passing environment variables via dart-define-from-file, or setting up stage-specific credentials.
SkillBFreshness: B★ 30Claude Code +9 - 0.611score
flutter-debugging
dhruvanbhalara
Use when diagnosing Flutter layout issues, inspecting widget rebuilds, setting breakpoints, or tracking down UI rendering anomalies.
SkillBFreshness: B★ 30Claude Code +9 - 0.611score
flutter-devtools
dhruvanbhalara
Use when profiling CPU performance, tracking memory leaks, inspecting widget trees, or viewing network traffic in Flutter DevTools.
SkillBFreshness: B★ 30Claude Code +9 - 0.611score
flutter-dio
dhruvanbhalara
Use when configuring HTTP network clients with Dio, adding auth token interceptors, handling retry logic, or caching API responses.
SkillBFreshness: B★ 30Claude Code +9 - 0.611score
flutter-firebase
dhruvanbhalara
Use when integrating Firebase Authentication, Cloud Firestore, Cloud Messaging, Crashlytics, or Firebase Analytics in Flutter.
SkillBFreshness: B★ 30Claude Code +9
Signals
- Stars
- 30
- Forks
- 4
- Open issues
- 0
- Last commit (this folder)
- Aug 29, 2026 (2 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/dhruvanbhalara/skills
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from dhruvanbhalara
- 0.611score
dart-fix-runtime-errors
dhruvanbhalara
Use when diagnosing runtime failures, type cast errors, null check violations, or unhandled asynchronous exceptions in Dart.
SkillBFreshness: B★ 30Claude Code +9 - 0.611score
dart-build-cli-app
dhruvanbhalara
Use when creating Dart command-line tools, parsing CLI arguments with args, handling exit codes, or managing child processes.
SkillBFreshness: B★ 30Claude Code +9 - 0.611score
dart-logic-patterns
dhruvanbhalara
Use when organizing business logic, implementing algorithmic workflows, or applying Dart data structures and pattern matching.
SkillBFreshness: B★ 30Claude Code +9 - 0.611score
dart-memory
dhruvanbhalara
Use when troubleshooting memory leaks, optimizing garbage collection overhead, or disposing streams and listeners in Dart.
SkillBFreshness: B★ 30Claude Code +9 - 0.611score
flutter-add-widget-preview
dhruvanbhalara
Use when configuring widget previews in Flutter development, testing visual component variations, or isolating widget UI states.
SkillBFreshness: B★ 30Claude Code +9 - 0.611score
flutter-bloc
dhruvanbhalara
Use when implementing state management with sealed BLoC classes, registering dependency injection with injectable, or setting up GoRouter listeners.
SkillBFreshness: B★ 30Claude Code +9
Cite this page
flutter-apply-architecture-best-practices skill. Agent Mart. https://agentmart.dev/skills/dhruvanbhalara-flutter-apply-architecture-best-practices (last updated 2026-10-24)