Çok modüllü uygulamalarda gizle

Hilt kod oluşturma işleminin, Hilt kullanan tüm Gradle modüllerine erişmesi gerekir. İlgili içeriği oluşturmak için kullanılan Derleyen Gradle modülü Application sınıfının tüm Hilt'i içermesi gerekir modüllerin ve oluşturucu enjekte edilen sınıfların geçişli bağımlılıklarında.

Çok modüllü projeniz normal Gradle modüllerinden oluşuyorsa bağımlılık enjeksiyonu ile Hilt. Ancak bu, özellik içeren uygulamalar için modüllerini inceleyin.

Özellik modüllerinde asma

Özellik modüllerinde modüllerin genellikle birbirine bağımlı olma şekli ters çevrilmiştir. Bu nedenle Hilt, özellik modüllerindeki ek açıklamaları işleyemez. Şunu yapmalısınız: gerçekleştirmek için Dagger'ı kullanın. bağımlılık ekleme özelliğini kullanabilirsiniz.

Özellik modülleriyle bu sorunu çözmek için bileşen bağımlılıklarını kullanmanız gerekir. Takip et şu adımları uygulayın:

  1. Bir şunu beyan edin: @EntryPoint arayüzü app modülünde (veya Hilt tarafından işlenebilen başka bir modülde) bağımlılıkları ortaya koyabiliriz.
  2. @EntryPoint arayüzüne bağlı bir Dagger bileşeni oluşturun.
  3. Dagger'ı özellik modülünde her zamanki gibi kullanın.

Bağımlılık yerleştirme tekniğini kullanarak Hilt sayfası. Buraya bir login özellik modülünü projenize ekleyin. Oturum açma özelliğini LoginActivity adlı bir etkinlikle birlikte. Bu, bağlantılarınızı gerektiği gibi .

Bu özellik için authInterceptor bağlaması olan bir OkHttpClient olması gerekir.

İlk olarak, SingletonComponent içinde yüklü bir @EntryPoint arayüzü oluşturun login modülünün gerektirdiği bağlamalarla:

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 içinde alan yerleştirme işlemi gerçekleştirmek için bir Hançer oluşturun @EntryPoint arayüzüne bağlı bileşene sahiptir:

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ünüzde Dagger'ı her zamanki gibi kullanın. Örneğin, Örneğin, SingletonComponent içindeki bağlamaları bir bir sınıfın bağımlılığı:

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 Dagger bileşeninin bir örneğini oluşturun SingletonComponent bağımlılıklarını almak için applicationContext kullanarak:

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 içeren bileşen bağımlılıkları modüllerini inceleyin.

Android'de Dagger hakkında daha fazla bilgi edinmek için Android'de Dagger'ı kullanma bölümüne bakın. uygulamalar.