Hilt의 기본 개념은 아래 링크에 잘 나와있다. 우선 읽어보자
[Hilt tutorial] https://blog.mindorks.com/dagger-hilt-tutorial
이걸 잘 읽고, 이제 아래 그림을 머릿속에 담아두며 실습을 해보자
Activity에서 Cake을 필요로 한다. 이때 Cake은 아래와 같은 종속성을 필요로한다.
Cake(bread: Bread)
Bread(flour: WheatFlour, milk: Milk)
WheatFlour(wheat: Wheat)
[Step 1] 우선 모듈에서 Provide를 구현하고 그 후에 Inject를 해주자.
/* Module */
import farmer <- 이런 import문은 들어가도 괜찮다 놀라지 말자
import Wheat
import WheatFlour ...
@Module
@InstallIn(SingletonComponent::class) // 생명주기 지정
class FoodModule {
@Singleton
@Provides
fun provideWheat(): Wheat = farmer().buy()
@Singleton
@Provide
fun provideWheatFlour(w: Wheat): WheatFlour = WheatFlour(w)
// 이제 이 Wheat은 위에 선언한 provideWheat으로부터 주입받는다.
// 그 증거로 코드 왼쪽에 ⬆ 이런 기호가 생기고, 누르면 주입받는 함수로 이동한다.
@Singleton
@Provide
fun provideMilk(): Milk = Cow().getMilk()
@Singleton
@Provide
fun provideBread(flour: WheatFlour, milk, Milk): Bread
= Bread(flour, milk)
// milk는 provideMilk에서, flour는 provideWhaetFlour에서 주입받는다.
}
/* 실제 예시 */
@Provides
@Singleton
fun provideDataBase(@ApplicationContext context: Context): AppDatabase = Room.databaseBuilder(
context,
AppDatabase::class.java, "mydata"
).build()
[Step 2] 이제 각 클래스 생성자에 @Inject 를 넣어주러 가자.
이제 클래스에서 뭐가 필요할 때, 다 생성자에 때려박고 Hilt한테 받으면 된다. WheatFlour 구현하다가 Farmer를 어떻게 얻지..? 하고 고민할 필요가 없다.
Cake @Inject constructor(bread: Bread){
// provideBread한테서 받음
}
Bread @Inject constructor(flour: WheatFlour, milk: Milk){
// provideWheatFlour, provideMilk 작동
}
WheatFlour @Inject constructor(wheat: Wheat){
// provideWheat 작동
}
[Step 3] 이제 Activity랑 앱 전역 설정해주러가자.
App.kt
@HiltAndroidApp
class App : Application() {
}
BakeryActivity.kt
@AndroidEntryPoint
class BakeryActivity: AppCompatActivity() {
}
// Fragment에서 쓰는거면 걔가 파생되는 activity에도 붙여줘야함.
manifest.xml
<application
android:allowBackup="true"
...
**android:name=".App" <- App 적용시키기**
>
모듈수준 build.gradle
... 맨 아래 디펜던시 블럭에 추가...
dependencies {
// Hilt
implementation "com.google.dagger:hilt-android:2.44"
kapt "com.google.dagger:hilt-compiler:2.44"
implementation 'androidx.fragment:fragment-ktx:1.5.3'
이렇게 하면 힐트 적용 완료
'프레임워크 > Android' 카테고리의 다른 글
CoordinatorLayout에서 겹쳐진 뷰의 터치 이벤트를 처리하는 방식 (0) | 2022.12.01 |
---|---|
Databinding Type mismatch 문제 : layout format 확인하기 (0) | 2022.11.30 |
Jetpack Navigation Safeargs 사용법 (0) | 2022.11.29 |
RecyclerView 요약정리 (0) | 2022.11.03 |
setContentView 안될 때 - onCreate 체크 (0) | 2022.10.04 |