Pembuatan kode Hilt memerlukan akses ke semua modul Gradle yang menggunakan Hilt. Modul
Gradle yang mengompilasi class
Application
Anda harus memiliki semua modul
Hilt dan class yang diinjeksikan melalui konstruktor dalam dependensi transitifnya.
Jika project multi-modul Anda terdiri dari modul Gradle reguler, Anda dapat menggunakan Hilt seperti yang dijelaskan dalam Injeksi dependensi dengan Hilt. Namun, hal ini tidak berlaku untuk aplikasi yang menyertakan modul fitur.
Hilt dalam modul fitur
Dalam modul fitur, cara modul bergantung satu sama lain akan terbalik. Oleh karena itu, Hilt tidak dapat memproses anotasi dalam modul fitur. Anda harus menggunakan Dagger untuk melakukan injeksi dependensi dalam modul fitur Anda.
Anda harus menggunakan dependensi komponen untuk mengatasi masalah ini pada modul fitur. Ikuti langkah-langkah ini:
- Deklarasikan
antarmuka
@EntryPoint
dalam modulapp
(atau dalam modul lain yang dapat diproses oleh Hilt) dengan dependensi yang dibutuhkan modul fitur. - Buat komponen Dagger yang bergantung pada antarmuka
@EntryPoint
. - Gunakan Dagger seperti biasa dalam modul fitur.
Pertimbangkan contoh dari halaman Injeksi dependensi dengan
Hilt. Misalnya Anda menambahkan
modul fitur login
ke project Anda. Anda mengimplementasikan fitur login
dengan aktivitas yang disebut LoginActivity
. Ini berarti Anda hanya bisa mendapatkan binding
dari komponen aplikasi.
Untuk fitur ini, Anda memerlukan OkHttpClient
dengan binding authInterceptor
.
Pertama, buat antarmuka @EntryPoint
yang diinstal di SingletonComponent
dengan binding yang diperlukan modul login
:
Kotlin
// LoginModuleDependencies.kt - File in the app module. @EntryPoint @InstallIn(SingletonComponent::class) interface LoginModuleDependencies { @AuthInterceptorOkHttpClient fun okHttpClient(): OkHttpClient }
Java
// LoginModuleDependencies.java - File in the app module. @EntryPoint @InstallIn(SingletonComponent.class) public interface LoginModuleDependencies { @AuthInterceptorOkHttpClient OkHttpClient okHttpClient(); }
Untuk melakukan injeksi kolom di LoginActivity
, buat komponen
Dagger yang bergantung pada antarmuka @EntryPoint
:
Kotlin
// LoginComponent.kt - File in the login module. @Component(dependencies = [LoginModuleDependencies::class]) interface LoginComponent { fun inject(activity: LoginActivity) @Component.Builder interface Builder { fun context(@BindsInstance context: Context): Builder fun appDependencies(loginModuleDependencies: LoginModuleDependencies): Builder fun build(): LoginComponent } }
Java
// LoginComponent.java - File in the login module. @Component(dependencies = LoginModuleDependencies.class) public interface LoginComponent { void inject(LoginActivity loginActivity); @Component.Builder interface Builder { Builder context(@BindsInstance Context context); Builder appDependencies(LoginModuleDependencies loginModuleDependencies); LoginComponent build(); } }
Setelah langkah-langkah tersebut selesai, gunakan Dagger seperti biasa dalam modul fitur. Misalnya,
Anda dapat menggunakan binding dari SingletonComponent
sebagai
dependensi class:
Kotlin
// LoginAnalyticsAdapter.kt - File in the login module. class LoginAnalyticsAdapter @Inject constructor( @AuthInterceptorOkHttpClient okHttpClient: OkHttpClient ) { ... }
Java
// LoginAnalyticsAdapter.java - File in the login module. public class LoginAnalyticsAdapter { private final OkHttpClient okHttpClient; @Inject LoginAnalyticsAdapter( @AuthInterceptorOkHttpClient OkHttpClient okHttpClient ) { this.okHttpClient = okHttpClient; } ... }
Untuk melakukan injeksi kolom, buat instance komponen Dagger
menggunakan applicationContext
untuk mendapatkan dependensi SingletonComponent
:
Kotlin
// LoginActivity.kt - File in the login module. class LoginActivity : AppCompatActivity() { @Inject lateinit var loginAnalyticsAdapter: LoginAnalyticsAdapter override fun onCreate(savedInstanceState: Bundle?) { DaggerLoginComponent.builder() .context(this) .appDependencies( EntryPointAccessors.fromApplication( applicationContext, LoginModuleDependencies::class.java ) ) .build() .inject(this) super.onCreate(savedInstanceState) ... } }
Java
// LoginActivity.java - File in the login module. public class LoginActivity extends AppCompatActivity { @Inject LoginAnalyticsAdapter loginAnalyticsAdapter; @Override protected void onCreate(Bundle savedInstanceState) { DaggerLoginComponent.builder() .context(this) .appDependencies( EntryPointAccessors.fromApplication( getApplicationContext(), LoginModuleDependencies.class ) ) .build() .inject(this); super.onCreate(savedInstanceState); ... } }
Untuk konteks selengkapnya tentang dependensi modul dalam modul fitur, lihat Dependensi komponen dengan modul fitur.
Untuk mengetahui informasi selengkapnya tentang Dagger di Android, lihat Menggunakan Dagger di aplikasi Android.