Hilt dalam aplikasi multi-modul

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:

  1. Deklarasikan antarmuka @EntryPoint dalam modul app (atau dalam modul lain yang dapat diproses oleh Hilt) dengan dependensi yang dibutuhkan modul fitur.
  2. Buat komponen Dagger yang bergantung pada antarmuka @EntryPoint.
  3. 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.