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:

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

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

 
@AuthInterceptorOkHttpClient
 
fun okHttpClient(): OkHttpClient
}
// 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:

// 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
 
}
}
// 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:

// LoginAnalyticsAdapter.kt - File in the login module.

class LoginAnalyticsAdapter @Inject constructor(
 
@AuthInterceptorOkHttpClient okHttpClient: OkHttpClient
) { ... }
// 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:

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