Zugriff in Apps mit mehreren Modulen

Die Hilt-Codegenerierung benötigt Zugriff auf alle Gradle-Module, die Hilt verwenden. Die Gradle-Modul, das Ihre Die Klasse Application muss alle Hilt-Funktionen haben Module und mit dem Konstruktor injizierte Klassen in ihren transitiven Abhängigkeiten.

Wenn Ihr Projekt mit mehreren Modulen aus regulären Gradle-Modulen besteht, können Sie verwenden Sie Hilt wie unter Abhängigkeitsinjektion mit Hilt. Dies ist jedoch nicht Hülle mit Apps, die Funktionsmerkmale Module.

Eingefügte Funktionsmodule

In Funktionsmodulen ist die Art und Weise, wie Module in der Regel voneinander abhängig sind, umgekehrt. Daher kann Hilt keine Anmerkungen in Funktionsmodulen verarbeiten. Du musst führen Sie mit Dagger Abhängigkeitsinjektion in Ihre Funktionsmodule.

Sie müssen Komponentenabhängigkeiten verwenden, um dieses Problem mit Funktionsmodulen zu lösen. Folgen diese Schritte:

  1. Deklarieren Sie ein @EntryPoint-Oberfläche im Modul app (oder in einem anderen Modul, das von Hilt verarbeitet werden kann) mit den Abhängigkeiten, die das Featuremodul benötigt.
  2. Erstellen Sie eine Dagger-Komponente, die von der @EntryPoint-Schnittstelle abhängig ist.
  3. Verwenden Sie Dagger wie gewohnt im Funktionsmodul.

Sehen wir uns das Beispiel aus der Abhängigkeitsinjektion mit Hilt-Seite. Angenommen, Sie fügen eine Funktionsmodul login zu Ihrem Projekt hinzugefügt. Sie implementieren die Anmeldefunktion. mit der Aktivität LoginActivity. Das bedeutet, dass Sie Bindungen aus der Anwendungskomponente.

Für dieses Feature benötigen Sie eine OkHttpClient mit der Bindung authInterceptor.

Erstellen Sie zuerst eine @EntryPoint-Schnittstelle, die in SingletonComponent installiert ist durch die Bindungen, die das Modul login benötigt:

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

Erstellen Sie einen Dagger, um ein Feld in den LoginActivity einzuschleusen Komponente, die von der @EntryPoint-Schnittstelle abhängt:

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

Sobald diese Schritte abgeschlossen sind, kannst du Dagger wie gewohnt in deinem Funktionsmodul verwenden. Für Sie können die Bindungen aus dem SingletonComponent als Beispiel Abhängigkeit einer Klasse:

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

Erstellen Sie eine Instanz der Dagger-Komponente, um ein Feld einzuschleusen Verwenden Sie applicationContext, um die SingletonComponent-Abhängigkeiten abzurufen:

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

Weitere Informationen zu Modulabhängigkeiten in Funktionsmodulen finden Sie unter Komponentenabhängigkeiten mit Funktion Module.

Weitere Informationen zu Dagger für Android finden Sie unter Dagger in Android verwenden. Apps.