android-create-hilt-module
Crear un módulo Hilt en di/*Module.kt con scopes y bindings de interfaces de dominio, y su reemplazo con fakes en tests; no para la capa de datos completa.
SKILL.md.claude/skills/android-create-hilt-module/SKILL.md
GitHubandroid-create-hilt-module
Crea un módulo Hilt que enlaza interfaces de dominio con implementaciones de datos o plataforma (di/<Nombre>Module.kt, en la raíz del paquete).
Cuándo usarla
- Una interfaz de dominio (repositorio, reloj, fuente de posiciones, motor de voz…) necesita implementación inyectable.
- Hay que proveer objetos de terceros (Room,
LocationManager, motor TTS) o sustituir dependencias en tests.
Cuándo NO usarla
- Entity, DAO y repositorio completos →
android-create-data-layer(que puede invocar esta skill). - Clase propia con constructor simple →
@Inject constructorbasta, sin módulo.
Precondiciones
@HiltAndroidApppresente en laApplicationde:app; si no, parar y avisar al agente principal.- La interfaz de dominio ya existe; el dominio y
:motorno dependen de Android ni de Hilt. - Decidir el scope:
SingletonComponent(Room, clientes, estado compartido),ViewModelComponent(por ViewModel).
Pasos
- Crear
di/<Nombre>Module.kt(paqueteapp.trombito.rallycopilot.di); nunca endomain/. - Interfaz con implementación propia:
@Module @InstallIn(<Componente>::class) abstract classcon@Binds; la impl lleva@Inject constructor. - Objetos sin
@Inject(builders, librerías):@Module @InstallIn(...) objectcon@Provides. No mezclar@Bindsy@Providesen la misma clase abstracta. @Singletonsolo con estado compartido o construcción cara; el resto sin scope.- Varias implementaciones del mismo tipo (dispatchers, reloj):
@Qualifierpropio, no@Namedcon strings. - Tests JVM (JUnit4): construir las clases a mano con fakes, sin Hilt. Si se necesita grafo (Robolectric +
@HiltAndroidTest), módulo de test con@TestInstallIn(components = [...], replaces = [<Nombre>Module::class]). - Compilar:
MissingBindingoDuplicateBindingsse corrigen en el módulo, no con@Providesredundantes.
Validaciones / tests
./gradlew assembleDebug(valida el grafo Hilt en compilación)../gradlew testDebugUnitTest ktlintCheck detekt lintDebug.
Definition of Done
- Cada interfaz de dominio tiene un único binding de producción (y otro de test si el grafo se usa en tests).
- Scope mínimo justificado; sin
@Singletongratuitos. - Reemplazo en tests con
@TestInstallIn(sin@UninstallModulessalvo excepción comentada). - El dominio no importa
dagger/hilt. - Build sin
MissingBinding/DuplicateBindings. -
./gradlew ktlintCheck detekt lintDebug testDebugUnitTest assembleDebugen verde.
Docs a actualizar
docs/arquitectura.mdsi se añade un módulo o scope nuevo · docs/ESTADO.md (skillsession-handoff)