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 dijelaskan dalam Injeksi dependensi dengan Hilt. Namun, hal ini tidak berlaku untuk aplikasi yang menyertakan modul fitur dinamis (DFM).

Hilt dalam modul fitur dinamis

Dalam DFM, cara umum modul bergantung satu sama lain akan terbalik. Oleh karena itu, Hilt tidak dapat memproses anotasi dalam modul fitur dinamis. Anda harus menggunakan Dagger untuk melakukan injeksi dependensi dalam DFM Anda.

Anda harus menggunakan dependensi komponen untuk menyelesaikan masalah ini dengan DFM. Ikuti langkah-langkah ini:

  1. Deklarasikan @EntryPoint antarmuka dalam modul app (atau dalam modul lain yang dapat diproses oleh Hilt) dengan dependensi yang dibutuhkan DFM.
  2. Buat komponen Dagger yang bergantung pada antarmuka @EntryPoint.
  3. Gunakan Dagger seperti biasa dalam DFM.

Pertimbangkan contoh dari halaman Injeksi dependensi dengan Hilt. Misalkan Anda menambahkan modul fitur dinamis 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 ApplicationComponent dengan binding yang diperlukan modul login:

Kotlin

// LoginModuleDependencies.kt - File in the app module.

@EntryPoint
@InstallIn(ApplicationComponent::class)
interface LoginModuleDependencies {

  @AuthInterceptorOkHttpClient
  fun okHttpClient(): OkHttpClient
}

Java

// LoginModuleDependencies.java - File in the app module.

@EntryPoint
@InstallIn(ApplicationComponent.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 itu selesai, gunakan Dagger seperti biasa dalam DFM Anda. Misalnya, Anda dapat menggunakan binding dari ApplicationComponent 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 ApplicationComponent:

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(
          EntryPointsAccessors.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(
          EntryPointsAccessors.fromApplication(
            getApplicationContext(),
            LoginModuleDependencies.class
          )
        )
        .build()
        .inject(this);

    super.onCreate(savedInstanceState);
    ...
  }
}

Untuk konteks lainnya tentang dependensi modul dalam modul fitur dinamis, lihat Dependensi komponen dengan modul fitur dinamis.

Untuk informasi selengkapnya tentang Dagger di Android, lihat Menggunakan Dagger di aplikasi Android.