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:
- Deklarieren Sie ein
@EntryPoint
-Oberfläche im Modulapp
(oder in einem anderen Modul, das von Hilt verarbeitet werden kann) mit den Abhängigkeiten, die das Featuremodul benötigt. - Erstellen Sie eine Dagger-Komponente, die von der
@EntryPoint
-Schnittstelle abhängig ist. - 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.