Skup się na aplikacjach składających się z wielu modułów

Generowanie kodu Hilt wymaga dostępu do wszystkich modułów Gradle, które używają Hilt. Moduł Gradle, który zbiera Zajęcia Application muszą mieć wszystkie Hilt i klasy wstrzykiwane przez konstruktora w zależnościach pośrednich.

Jeśli Twój projekt z wieloma modułami składa się ze zwykłych modułów Gradle, możesz użyj Hilt, jak opisano w sekcji Wstrzykiwanie zależności z Hilt. Nie jest to jednak w przypadku aplikacji, które zawierają funkcje .

Uwzględnienie modułów funkcji

W modułach funkcji odwrócony jest sposób, w jaki moduły zwykle są od siebie zależne. Z tego powodu Hilt nie może przetwarzać adnotacji w modułach funkcji. Musisz użyj Konferencji, aby wykonać wstrzykiwanie zależności w modułach funkcji.

Aby rozwiązać ten problem z modułami funkcji, musisz użyć zależności komponentów. Obserwuj wykonaj te czynności:

  1. Zadeklaruj Interfejs @EntryPoint w module app (lub w dowolnym innym module, który może być przetwarzany przez Hilt). z zależnościami wymaganymi przez ten moduł.
  2. Utwórz komponent Dagger zależny od interfejsu @EntryPoint.
  3. Używaj Daggera w module funkcji w zwykły sposób.

Weźmy przykład z Dependency Injection with Hilt. Przypuśćmy, że do grupy reklam został dodany komponent login moduł funkcji do projektu. Ty wdrażasz funkcję logowania z aktywnością o nazwie LoginActivity. Oznacza to, że możesz uzyskać powiązania tylko z komponentu aplikacji.

Aby korzystać z tej funkcji, potrzebujesz obiektu OkHttpClient z powiązaniem authInterceptor.

Najpierw utwórz interfejs @EntryPoint zainstalowany w SingletonComponent z powiązaniami wymaganymi przez moduł login:

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

Aby wykonać wstrzyknięcie pola w LoginActivity, utwórz sztylet który zależy od interfejsu @EntryPoint:

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

Po wykonaniu tych czynności jak zwykle użyj Daggera w module funkcji. Dla: możesz na przykład użyć powiązań z SingletonComponent jako zależność klasy:

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

Aby wykonać wstrzykiwanie pól, utwórz instancję komponentu Sztylet za pomocą klasy applicationContext, aby uzyskać zależności SingletonComponent:

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

Więcej informacji o zależnościach modułów w modułach funkcji: Zależności komponentów z funkcją .

Więcej informacji o Daggerze na Androidzie: Używanie Daggera w Androidzie