Gradle 추가
루트 경로
dependencies {
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
}
앱 경로
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'
dependencies {
//hilt used
implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
//hilt test
androidTestImplementation "com.google.dagger:hilt-android-testing:$hilt_version"
kaptAndroidTest "com.google.dagger:hilt-android-compiler:$hilt_version"
}
컴파일 옵션 추가
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
...
defaultConfig {
...
testInstrumentationRunner "com.example.android.hilt.CustomTestRunner"
}
@HiltAndroidApp 추가
Hilt사용을 위해서는 Application에 해당 어노테이션을 반드시 추가
@HiltAndroidApp
class AppApplication : Application(){
}
@AndroidEntryPoint
Activity, Fragment, View, Service, BroadcaseReceiver에 종속 항목을 삽입할 수 있도록 지정
만약 상속하는 class 또는 해당 fragment를 사용하는 activity 있다면 동일하게 어노테이션을 필수로 지정
@Inject
종속 항목 삽입 (의존성을 주입받으려는 변수에 지정)
위의 AndroidEntryPoint로 종속 주입이 가능한 상태일 때만 사용가능 (onCreate() 또는 View#super() 순간 인스턴스 생성)
필드 주입
@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
@Inject lateinit var analytics: AnalyticsAdapter
...
생성자 주입
class AnalyticsAdapter @Inject constructor(
private val service: AnalyticsService) {
...
@Module, @InstallIn, @Binds, @Provides
인터페이스 또는 외부 라이브러리 클래스는 생성자 삽입 불가능할 경우 사용
@InstallIn
어떤 표준 Component에 Module을 install할지 지정
@Binds
인터페이스의 인스턴스를 제공해야할 때, 자신의 일부를 Hilt에게 알림
만약에 Activity와 Service에서 동일 객체를 동시에 사용한다면 추가 바인딩 필요
//1. 인터페이스
interface AnalyticsService {
fun analyticsMethods()
}
//2. 구현체, Hilt를 통한 생성자 주입을 위하여 생성자 추가
class AnalyticsServiceImpl @Inject constructor(
...
) : AnalyticsService { ... }
//3. 모듈 구현
@Module
@InstallIn(ActivityComponent::class) //activity에 사용될 것을 알림
abstract class AnalyticsModule {
@Binds //인스턴스를 제공할 때 사용할 구현을 Hilt에 알림
abstract fun bindAnalyticsService(
analyticsServiceImpl: AnalyticsServiceImpl
): AnalyticsService
}
@Provides
함수의 인스턴스를 제공해야할 때, 자신을 Hilt에게 알림
Hilt는 해당 유형의 인스턴스를 제공할 때마다 함수 본문 실행
@Module
@InstallIn(ActivityComponent::class)
object AnalyticsModule {
@Provides
fun provideAnalyticsService(): AnalyticsService {
return Retrofit.Builder()
.baseUrl("https://example.com")
.build()
.create(AnalyticsService::class.java)
}
}
@Qualifier
동일한 모듈이 있는 경우, 모호성을 피하기위해 지정자 사용
@Qualifier
annotation class InMemoryLogger
@Qualifier
annotation class DatabaseLogger
@InstallIn(ApplicationComponent::class)
@Module
abstract class LoggingDatabaseModule {
@DatabaseLogger
@Singleton
@Binds
abstract fun bindDatabaseLogger(impl: LoggerLocalDataSource): LoggerDataSource
}
@InstallIn(ActivityComponent::class)
@Module
abstract class LoggingInMemoryModule {
@InMemoryLogger
@ActivityScoped
@Binds
abstract fun bindInMemoryLogger(impl: LoggerInMemoryDataSource): LoggerDataSource
}
https://developer.android.com/training/dependency-injection/hilt-android?hl=ko
'개발 log (개발) > mobile' 카테고리의 다른 글
Network call has failed for a following reason: Unable to create call adapter for retrofit2.Response (0) | 2021.01.23 |
---|---|
KaKao 로그인 (0) | 2020.11.01 |
'java.net.SocketTimeoutException' okhttp (0) | 2017.09.07 |
'LinkedHashMap' 전달 불가 (0) | 2016.12.12 |
'AsyncTask 인스턴스 1번만 실행 가능' java.lang.IllegalStateException (0) | 2016.11.25 |