flutter-architecture
Skill0 starsChanged 12 days agoMITView on GitHub
Clean Architecture Feature-First para Flutter. Guía el diseño modular en lib/features/<feature>/ (domain, data, presentation) con BLoC/Cubit, Inyección de Dependencias (GetIt/Injectable), manejo funcional de errores con Result sealed class y pruebas unitarias con mocktail y bloc_test.
9 other projects use a version of this.
Adopted by
Most recently taken up by
- lubshad/skillstheir own version, first seen Nov 1, 2026
- thienqo/flutter-skillstheir own version, first seen Nov 1, 2026
- gspencergoog/skillstheir own version, first seen Oct 16, 2026
- thiennc-tesoglobal/flutter-skillstheir own version, first seen Aug 30, 2026
- zakariaf/CatchLawtheir own version, first seen Aug 1, 2026
- zakariaf/Flutter-Skillstheir own version, first seen Jul 21, 2026
Used with
Projects with it also use flutter-performance and dart-concurrency.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
zakariafSkillflutter-performance
Enforces Flutter runtime performance — const subtrees, minimal rebuild scope via ref.watch(select), lazy ListView/GridView builders and slivers, sized image decode (cacheWidth/ResizeImage), heavy work off the UI isolate via compute/Isolate, surgical RepaintBoundary, dispose everything, and measurement in profile mode on a floor device. Use when optimizing UI, diagnosing jank or dropped frames, tuning long lists or images, reviewing rebuild/repaint scope, or when the task mentions const, select, ListView.builder, cacheWidth, compute, RepaintBoundary, AnimatedBuilder, DevTools, raster thread, or 60/120fps.
Also in 4 projects that use this
thiennc-tesoglobalSkilldart-concurrency
Design and debug Dart asynchronous infrastructure with Future, Stream, isolates, cancellation, and lifecycle-safe ownership. Use for races, stale results, background CPU work, stream leaks, or async error handling; not for routine form-local validation or submission unless its underlying ordering mechanism is the task.
Also in 3 projects that use this
Other versions9 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 9
- MADTeacher/mad-agents-skills★ 106same name
- zakariaf/Flutter-Skills★ 32same name
- thiennc-tesoglobal/flutter-skills★ 16same name
- thienqo/flutter-skills★ 16same name
- gspencergoog/skills★ 2same name
- lubshad/skills★ 1same name
- paurakhsharma/skills★ 1same name
- sonhaicoder/haiclaudeskill★ 0same name
- zakariaf/CatchLaw★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository26 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- git-cleanupSkill
- openspec-apply-changeSkill
- openspec-archive-changeSkill
- openspec-exploreSkill
- openspec-proposeSkill
- openspec-sync-specsSkill
- openspec-update-changeSkill
- skill-creatorSkill
- openspec-apply-changeSkill
- openspec-archive-changeSkill
- openspec-exploreSkill
- openspec-proposeSkill
- openspec-sync-specsSkill
- openspec-update-changeSkill
- monorepo-architectureSkill
- nestjs-architectureSkill
- nextjs-architectureSkill
- react-native-architectureSkill
- dart-import-organizerSkill
- ssh-connectSkill
- git-cleanupSkill
- gh-cliSkill
- glab-cliSkill
- ts-import-organizerSkill
The file
Files
🏛️ Flutter Feature-First Clean Architecture Standard
🎯 Propósito
Estandarizar el diseño, la modularización y la construcción de aplicaciones Flutter escalables bajo el patrón de Feature-First Clean Architecture (segmentación vertical por características de negocio) combinado con BLoC / Cubit para la gestión reactiva de estado, GetIt / Injectable para Inversión de Dependencias (DI), y tipos funcionales sellados Result<Success, Failure> de Dart 3 para erradicar fallos no controlados en tiempo de ejecución.
Garantiza que el dominio de negocio (domain) permanezca completamente puro, libre de dependencias de Flutter y de detalles de infraestructura (data), mientras que la capa visual (presentation) reacciona a estados inmutables sin lógica de negocio incrustada.
⚡ Cuándo Activar esta Skill
- Al crear una nueva feature o módulo de negocio dentro de
lib/features/<feature>/. - Al refactorizar código monolítico o desestructurado hacia Clean Architecture en Flutter.
- Al implementar casos de uso (
usecases), contratos de repositorio (domain/repositories/) o entidades puras (domain/entities/). - Al diseñar orígenes de datos (
datasources), modelos DTO (data/models/) o implementaciones de repositorio (data/repositories/). - Al construir controladores de estado con
flutter_bloc(BlocoCubit), eventos y estados inmutables. - Al configurar el registro de dependencias con
GetIt/Injectable(core/di/injection_container.dart). - Al escribir pruebas unitarias con
mocktailybloc_testentest/features/<feature>/.
📋 Flujo de Trabajo Paso a Paso
flowchart TD
A["1. Identificar Característica\n(ej: 'authentication', 'checkout', 'profile')"] --> B["2. Andamiar Feature\n(scripts/scaffold-feature.mjs)"]
B --> C["3. Definir Entidad de Dominio\n(domain/entities/<entity>.dart)"]
C --> D["4. Contrato de Repositorio\n(domain/repositories/<entity>_repository.dart)"]
D --> E["5. Caso de Uso (UseCase)\n(domain/usecases/get_<entity>.dart)"]
E --> F["6. Modelo & Serialización\n(data/models/<entity>_model.dart)"]
F --> G["7. DataSource Remoto / Local\n(data/datasources/<entity>_remote_data_source.dart)"]
G --> H["8. Repositorio Impl & Result\n(data/repositories/<entity>_repository_impl.dart)"]
H --> I["9. Gestión de Estado BLoC/Cubit\n(presentation/bloc/<entity>_bloc.dart)"]
I --> J["10. Interfaz de Usuario\n(presentation/screens/ y presentation/widgets/)"]
J --> K["11. Registrar en GetIt DI & Unit Tests\n(core/di/ y test/features/<feature>/)"]Secuencia Obligatoria de Construcción por Feature
Al crear una feature <feature> con un modelo/entidad central <entity>, generar y configurar los archivos en este orden estricto:
- Entidad de Dominio (
domain/entities/<entity>.dart):- Clase inmutable con campos
finalo anotada conEquatable. - Libre de dependencias externas o de Flutter (Dart puro).
- Clase inmutable con campos
- Contrato de Repositorio (
domain/repositories/<entity>_repository.dart):- Clase abstracta pura (
abstract interface class). - Todos sus métodos retornan
Future<Result<T, Failure>>oStream<Result<T, Failure>>.
- Clase abstracta pura (
- Casos de Uso (
domain/usecases/<action>_<entity>.dart):- Clase con método
call()que implementa una única regla de negocio. - Depende exclusivamente de interfaces de repositorio del dominio.
- Clase con método
- Modelo de Datos (
data/models/<entity>_model.dart):- Extiende de la entidad de dominio (
class <Entity>Model extends <Entity>). - Implementa serialización:
fromJson(Map<String, dynamic> json)ytoJson().
- Extiende de la entidad de dominio (
- Data Source (
data/datasources/<entity>_remote_data_source.dart):- Contrato abstracto y clase de implementación que interactúa con HTTP (Dio/Http), Firebase, GraphQL o bases de datos locales (Drift/Hive/Isar).
- Lanza excepciones de infraestructura (
ServerException,CacheException) que serán capturadas únicamente por la implementación del repositorio.
- Implementación de Repositorio (
data/repositories/<entity>_repository_impl.dart):- Implementa la interfaz del dominio (
implements <Entity>Repository). - Captura excepciones del DataSource y las transforma en instancias de
Failuredentro deResult.failure(failure).
- Implementa la interfaz del dominio (
- Controlador de Estado BLoC/Cubit (
presentation/bloc/):state.dart: Clase sellada con estados inmutables (Initial,Loading,Success,Error).event.dart(en BLoC): Eventos declarativos para cada interacción del usuario.bloc.dart: Orquesta los casos de uso y emite estados.
- UI Presentation (
presentation/screens/ywidgets/):Screen: Consume el BLoC medianteBlocProvider,BlocBuilderoBlocConsumer.Widgets: Componentes reutilizables y atómicos desacoplados.
- Inyección de Dependencias (
core/di/injection_container.dart):- Registrar DataSource (
LazySingleton), Repositorio (LazySingleton), Casos de Uso (LazySingleton) y BLoC (Factory).
- Registrar DataSource (
- Pruebas Unitarias (
test/features/<feature>/):- Mockear dependencias con
mocktail(class Mock<Entity>Repository extends Mock implements <Entity>Repository {}). - Probar emisión secuencial de estados con
bloc_test.
- Mockear dependencias con
🏗️ Estructura Canónica de Directorios
lib/
├── core/
│ ├── constants/ # Constantes globales, colores y endpoints
│ ├── di/ # Inyección de dependencias (injection_container.dart)
│ ├── error/ # Fallos (failures.dart) y excepciones (exceptions.dart)
│ ├── network/ # Cliente HTTP (dio_client.dart), interceptores
│ ├── theme/ # ThemeData, estilos de tipografía
│ ├── utils/ # Result sealed class (result.dart), usecase interface
│ └── widgets/ # Widgets globales compartidos (AppButton, LoadingIndicator)
├── features/
│ └── <feature_name>/ # Vertical slice (ej. authentication, catalog, checkout)
│ ├── data/
│ │ ├── datasources/ # <feature>_remote_data_source.dart, local_data_source.dart
│ │ ├── models/ # <feature>_model.dart (extiende de Entity + JSON)
│ │ └── repositories/ # <feature>_repository_impl.dart
│ ├── domain/
│ │ ├── entities/ # <feature>.dart (entidad pura de negocio)
│ │ ├── repositories/ # <feature>_repository.dart (contrato de interfaz)
│ │ └── usecases/ # get_<feature>.dart, create_<feature>.dart
│ └── presentation/
│ ├── bloc/ # <feature>_bloc.dart, <feature>_event.dart, <feature>_state.dart
│ ├── screens/ # <feature>_screen.dart (punto de entrada visual)
│ └── widgets/ # Sub-widgets encapsulados de la pantalla
└── main.dart # Inicialización de GetIt y runApp⚠️ Reglas Críticas
- Regla de Dependencia Unidireccional:
domainNUNCA debe importar código dedatani depresentation.domaines Dart puro: PROHIBIDO importarpackage:flutter/material.darto paquetes de persistencia endomain/.presentationinteractúa con el dominio únicamente a través de Casos de Uso (Use Cases) o el BLoC. PROHIBIDO inyectar DataSources o Repositorios directamente en Widgets.
- Uso Obligatorio del Patrón Result / Either:
- Los contratos de repositorios y use cases NUNCA deben permitir que excepciones no controladas escalen a la capa visual.
- Las excepciones se atrapan en
data/repositories/*y se envuelven en unResult.failure(Failure(...)).
- Inmutabilidad Absoluta en BLoC / Cubit:
- Todos los estados y eventos deben ser clases inmutables con campos
finaly extender deEquatableo usar Dart 3sealed class. - Nunca mutar colecciones in-place: emitir siempre copias nuevas (
List.of(state.items)..add(...)ocopyWith).
- Todos los estados y eventos deben ser clases inmutables con campos
- Registro de Dependencias en GetIt:
- DataSources, Repositorios y UseCases deben registrarse como
registerLazySingleton. - Los BLoCs / Cubits deben registrarse como
registerFactorypara garantizar instancias limpias por pantalla si no son globales.
- DataSources, Repositorios y UseCases deben registrarse como
- Estructura de Tests Espejo:
- Cada archivo en
lib/features/<feature>/con lógica evaluable debe tener su archivo correspondiente entest/features/<feature>/. - Usar
mocktailen lugar demockitopara evitar pasos debuild_runnerlentos e innecesarios.
- Cada archivo en
🛠️ Scripts y Herramientas Auxiliares
Rutas:
<skill-dir>es el directorio que contiene esteSKILL.md(p. ej..claude/skills/<name>/o.agents/skills/<name>/). Ejecuta los scripts desde la raíz del proyecto del usuario, no desde<skill-dir>.
Seguridad: el script aborta sin escribir nada si alguno de los archivos que genera ya existe. Ejecuta primero con
--dry-runpara ver qué se va a crear. Usa--force(sobrescribe esos archivos) solo con confirmación explícita del usuario.
CLI Scaffolder: scaffold-feature.mjs
La skill incluye un generador CLI determinista para andamiar una feature completa lista para producción en segundos:
# Andamiar una feature completa con BLoC, Domain, Data y Tests:
node <skill-dir>/scripts/scaffold-feature.mjs auth --model user
# Andamiar usando Cubit en lugar de BLoC tradicional:
node <skill-dir>/scripts/scaffold-feature.mjs cart --model cart_item --cubit
# Modo simulación sin escribir archivos (Dry Run):
node <skill-dir>/scripts/scaffold-feature.mjs billing --model invoice --dry-run
# Sobrescribir archivos generados que ya existen (solo con confirmación del usuario):
node <skill-dir>/scripts/scaffold-feature.mjs billing --model invoice --force📚 Referencias Adicionales
- Feature-First Clean Architecture: Anatomía detallada de capas y límites.
- BLoC & State Management: Convenciones de estados, eventos y
bloc_test. - Result Pattern & Error Handling: Clase sellada
Resultde Dart 3 yFailure. - Dependency Injection with GetIt: Patrones de registro y ciclo de vida de dependencias.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

