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:
- Zadeklaruj
Interfejs
@EntryPoint
w moduleapp
(lub w dowolnym innym module, który może być przetwarzany przez Hilt). z zależnościami wymaganymi przez ten moduł. - Utwórz komponent Dagger zależny od interfejsu
@EntryPoint
. - 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
:
// 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
:
// 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:
// 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
:
// 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