{"id":19728635,"url":"https://github.com/sczerwinski/android-hilt","last_synced_at":"2025-06-15T14:39:18.379Z","repository":{"id":38198113,"uuid":"323991103","full_name":"sczerwinski/android-hilt","owner":"sczerwinski","description":"Extensions for Dagger Hilt","archived":false,"fork":false,"pushed_at":"2024-08-23T10:52:37.000Z","size":502,"stargazers_count":49,"open_issues_count":12,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-04-30T01:36:52.060Z","etag":null,"topics":["android","dependency-injection","hilt"],"latest_commit_sha":null,"homepage":"https://czerwinski.it/projects/android-hilt/","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sczerwinski.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"sczerwinski","ko_fi":"sczerwinski"}},"created_at":"2020-12-23T20:00:35.000Z","updated_at":"2025-04-16T16:19:23.000Z","dependencies_parsed_at":"2024-05-28T02:07:15.664Z","dependency_job_id":"25564c58-645f-4140-9afa-33fbecc339f4","html_url":"https://github.com/sczerwinski/android-hilt","commit_stats":null,"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/sczerwinski/android-hilt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sczerwinski%2Fandroid-hilt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sczerwinski%2Fandroid-hilt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sczerwinski%2Fandroid-hilt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sczerwinski%2Fandroid-hilt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sczerwinski","download_url":"https://codeload.github.com/sczerwinski/android-hilt/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sczerwinski%2Fandroid-hilt/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259991224,"owners_count":22942587,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","dependency-injection","hilt"],"created_at":"2024-11-12T00:06:23.492Z","updated_at":"2025-06-15T14:39:18.336Z","avatar_url":"https://github.com/sczerwinski.png","language":"Kotlin","funding_links":["https://github.com/sponsors/sczerwinski","https://ko-fi.com/sczerwinski"],"categories":[],"sub_categories":[],"readme":"[![Build](https://github.com/sczerwinski/android-hilt/workflows/Build/badge.svg)][ci-build]\n\n# Extensions for Dagger Hilt\n\n## Hilt Extensions\n\n[![Maven Central](https://img.shields.io/maven-central/v/it.czerwinski.android.hilt/hilt-extensions)][hilt-extensions-release]\n[![Sonatype Nexus (Snapshots)](https://img.shields.io/nexus/s/it.czerwinski.android.hilt/hilt-extensions?server=https%3A%2F%2Foss.sonatype.org)][hilt-extensions-snapshot]\n\n\u003cdetails\u003e\n  \u003csummary\u003eKotlin\u003c/summary\u003e\n\n  ```kotlin\n  dependencies {\n      implementation(\"com.google.dagger:hilt-android:2.51.1\")\n      ksp(\"com.google.dagger:hilt-android-compiler:2.51.1\")\n      implementation(\"it.czerwinski.android.hilt:hilt-extensions:[VERSION]\")\n      ksp(\"it.czerwinski.android.hilt:hilt-processor-ksp:[VERSION]\")\n  }\n  ```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eGroovy\u003c/summary\u003e\n\n  ```groovy\n  dependencies {\n      implementation 'com.google.dagger:hilt-android:2.51.1'\n      ksp 'com.google.dagger:hilt-android-compiler:2.51.1'\n      implementation 'it.czerwinski.android.hilt:hilt-extensions:[VERSION]'\n      ksp 'it.czerwinski.android.hilt:hilt-processor-ksp:[VERSION]'\n  }\n  ```\n\u003c/details\u003e\n\n### Property Delegation\n\nWith this library, it is possible to delegate properties to additional objects.\n\n#### `dagger.Lazy`\n\n```kotlin\nval lazy: dagger.Lazy\u003cString\u003e\n\nval property: String by lazy\n```\n\n#### `javax.inject.Provider`\n\n```kotlin\nval intProvider: Provider\u003cInt\u003e\n\nval property: Int by intProvider\n```\n\n### Generating Hilt Modules\n\n#### `@Bound` and `@BoundTo`\nMarks implementation bound to the given supertype in the given component.\n\n`@Bound` annotation (added in v1.1.0) works exactly like `@BoundTo` annotation,\nbut it implicitly uses the direct supertype of the annotated class. It may only\nannotate classes having exactly one direct supertype, excluding `java.lang.Object`. \n\nFor example:\n```kotlin\ninterface Repository\n\n@BoundTo(supertype = Repository::class, component = SingletonComponent::class)\nclass RepositoryA @Inject constructor() : Repository\n\n@BoundTo(supertype = Repository::class, component = SingletonComponent::class)\n@Singleton\n@Named(\"online\")\nclass RepositoryB @Inject constructor() : Repository\n\n@Bound(component = SingletonComponent::class)\n@Named(\"offline\")\nclass RepositoryC @Inject constructor() : Repository\n```\nwill generate module:\n```kotlin\n@Module\n@InstallIn(SingletonComponent::class)\npublic interface Repository_SingletonComponent_BindingsModule {\n\n    @Binds\n    public fun bindRepositoryA(implementation: RepositoryA): Repository\n\n    @Binds\n    @Singleton\n    @Named(\"online\")\n    public fun bindRepositoryB(implementation: RepositoryB): Repository\n\n    @Binds\n    @Named(\"offline\")\n    public fun bindRepositoryC(implementation: RepositoryC): Repository\n}\n```\n\nSince release 1.1.0, component property is optional, and set to `SingletonComponent` by default.\n\n#### `@FactoryMethod`\nMarks factory method for the class returned by the annotated function.\n\nFor example, for a Room database:\n```kotlin\n@Database(\n    entities = [\n        User::class\n    ],\n    version = 1\n)\nabstract class AppDatabase : RoomDatabase() {\n\n    @FactoryMethod(component = SingletonComponent::class)\n    @Singleton\n    abstract fun usersDao(): UsersDao\n}\n```\nand a database factory:\n```kotlin\ninterface DatabaseFactory {\n\n    @FactoryMethod(component = SingletonComponent::class)\n    @Singleton\n    fun createDatabase(): AppDatabase\n}\n```\nand a database factory provider:\n```kotlin\nobject DatabaseFactoryProvider {\n\n    @FactoryMethod(component = SingletonComponent::class)\n    fun createDatabaseFactory(\n        @ApplicationContext context: Context\n    ): DatabaseFactory =\n        if (BuildConfig.DEBUG) TestDatabaseFactory(context)\n        else ProductionDatabaseFactory(context)\n}\n```\nannotation processor will generate modules:\n```kotlin\n@Module\n@InstallIn(SingletonComponent::class)\npublic object UsersDao_SingletonComponent_FactoryMethodsModule {\n    @Provides\n    @Singleton\n    public fun appDatabase_usersDao(factory: AppDatabase): UsersDao = factory.usersDao()\n}\n```\n```kotlin\n@Module\n@InstallIn(SingletonComponent::class)\npublic object AppDatabase_SingletonComponent_FactoryMethodsModule {\n    @Provides\n    @Singleton\n    public fun databaseFactory_createDatabase(factory: DatabaseFactory): AppDatabase =\n        factory.createDatabase()\n}\n```\n```kotlin\n@Module\n@InstallIn(SingletonComponent::class)\npublic object DatabaseFactory_SingletonComponent_FactoryMethodsModule {\n    @Provides\n    public fun databaseFactoryProvider_createDatabaseFactory(\n            @ApplicationContext context: Context\n    ): DatabaseFactory = DatabaseFactoryProvider.INSTANCE.createDatabaseFactory(context)\n}\n```\n\nSince release 1.1.0, component property is optional, and set to `SingletonComponent` by default.\n\n#### `@TestBound`, `@TestBoundTo` and `@TestFactoryMethod`\n\nVersion 1.1.0 introduces additional test annotations that can be used to generate modules\nannotated with [`@TestInstallIn`][TestInstallIn], instead of `@InstallIn`:\n- `@TestBound` (instead of `@Bound`)\n- `@TestBoundTo` (instead of `@BoundTo`)\n- `@TestFactoryMethod` (instead of `@FactoryMethod`)\n\nTest module generated using `@TestBound` and/or `@TestBoundTo` will replace the module generated using\n`@Bound` and/or `@BoundTo`.\n\nTest module generated using `@TestFactoryMethod` will replace the module generated with `@FactoryMethod`.\n\n## Hilt Testing Extensions\n\n[![Maven Central](https://img.shields.io/maven-central/v/it.czerwinski.android.hilt/hilt-fragment-testing)][hilt-fragment-testing-release]\n[![Sonatype Nexus (Snapshots)](https://img.shields.io/nexus/s/it.czerwinski.android.hilt/hilt-fragment-testing?server=https%3A%2F%2Foss.sonatype.org)][hilt-fragment-testing-snapshot]\n\nMust be used as `debugImplementation` dependency to properly register `EmptyFragmentActivity` in manifest.\n\n\u003cdetails\u003e\n  \u003csummary\u003eKotlin\u003c/summary\u003e\n\n  ```kotlin\n  dependencies {\n      implementation(\"com.google.dagger:hilt-android:2.51.1\")\n\n      androidTestImplementation(\"androidx.test:runner:1.5.2\")\n      debugImplementation(\"it.czerwinski.android.hilt:hilt-fragment-testing:[VERSION]\")\n  }\n  ```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eGroovy\u003c/summary\u003e\n\n  ```groovy\n  dependencies {\n      implementation 'com.google.dagger:hilt-android:2.51.1'\n\n      androidTestImplementation 'androidx.test:runner:1.5.2'\n      debugImplementation 'it.czerwinski.android.hilt:hilt-fragment-testing:[VERSION]'\n  }\n  ```\n\u003c/details\u003e\n\n### Testing Fragments With Hilt\n\n#### `HiltFragmentScenario`\nWorks exactly like [FragmentScenario], but supports Hilt dependency injection in fragments.\n\n\n[ci-build]: https://github.com/sczerwinski/android-hilt/actions?query=workflow%3ABuild\n[hilt-extensions-release]: https://repo1.maven.org/maven2/it/czerwinski/android/hilt/hilt-extensions/\n[hilt-extensions-snapshot]: https://oss.sonatype.org/content/repositories/snapshots/it/czerwinski/android/hilt/hilt-extensions/\n[hilt-fragment-testing-release]: https://repo1.maven.org/maven2/it/czerwinski/android/hilt/hilt-fragment-testing/\n[hilt-fragment-testing-snapshot]: https://oss.sonatype.org/content/repositories/snapshots/it/czerwinski/android/hilt/hilt-fragment-testing/\n\n[FragmentScenario]: https://developer.android.com/guide/fragments/test\n[TestInstallIn]: https://dagger.dev/hilt/testing#testinstallin\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsczerwinski%2Fandroid-hilt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsczerwinski%2Fandroid-hilt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsczerwinski%2Fandroid-hilt/lists"}