Çok modüllü uygulamalarda gizle

Hilt kod oluşturma işlemi, Hilt kullanan tüm Gradle modüllerine erişebilmelidir. Application sınıfınızı derleyen Gradle modülünün geçişli bağımlılıklarında tüm Hilt modüllerini ve kurucu tarafından enjekte edilen sınıfları içermesi gerekir.

Çok modüllü projeniz normal Gradle modüllerinden oluşuyorsa Hilt'i Hilt ile Bağımlılık yerleştirme bölümünde açıklandığı gibi kullanabilirsiniz. Ancak bu durum, özellik modüllerini içeren uygulamalar için geçerli değildir.

Özellik modüllerini içerir

Özellik modüllerinde, modüllerin genellikle birbirine bağlı olma şekli tersine çevrilir. Bu nedenle, Hilt, özellik modüllerindeki ek açıklamaları işleyemez. Özellik modüllerinize bağımlılık ekleme işlemi gerçekleştirmek için Dagger'ı kullanmanız gerekir.

Bu sorunu özellik modülleriyle çözmek için bileşen bağımlılıklarını kullanmanız gerekir. Aşağıdaki adımları uygulayın:

  1. app modülünde (veya Hilt tarafından işlenebilen başka herhangi bir modülde) özellik modülünün ihtiyaç duyduğu bağımlılıklarla birlikte bir @EntryPoint arayüzü tanımlayın.
  2. @EntryPoint arayüzüne bağlı bir Dagger bileşeni oluşturun.
  3. Özellik modülünde Dagger'ı her zamanki gibi kullanın.

Hilt ile Bağımlılık yerleştirme sayfasındaki örneği düşünün. Projenize bir login özellik modülü eklediğinizi varsayalım. Giriş özelliğini LoginActivity adlı bir etkinlikle uygularsınız. Bu, bağlamaları yalnızca uygulama bileşeninden alabileceğiniz anlamına gelir.

Bu özellik için authInterceptor bağlamalı bir OkHttpClient gerekir.

Öncelikle, login modülünün ihtiyaç duyduğu bağlamalarla SingletonComponent içinde yüklü bir @EntryPoint arayüzü oluşturun:

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();
}

LoginActivity aracında alan yerleştirme yapmak için @EntryPoint arayüzüne bağlı bir Dagger bileşeni oluşturun:

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();
  }
}

Bu adımlar tamamlandıktan sonra özellik modülünde Dagger'ı her zamanki gibi kullanın. Örneğin, SingletonComponent aracındaki bağlamaları bir sınıfın bağımlılığı olarak kullanabilirsiniz:

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;
  }
  ...
}

Alan yerleştirme işlemi gerçekleştirmek için applicationContext kullanarak Dagger bileşeninin bir örneğini oluşturarak SingletonComponent bağımlılıklarını elde edin:

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);
    ...
  }
}

Özellik modüllerindeki modül bağımlılıkları hakkında daha fazla bilgi için Özellik modülleriyle bileşen bağımlılıkları bölümüne bakın.

Android'de Dagger hakkında daha fazla bilgi edinmek için Dagger'ı Android uygulamalarında kullanma başlıklı makaleye göz atın.