반응형
Hilt는 Android에서 사용되는 의존성 주입 라이브러리로, Dagger를 기반으로 만들어졌습니다. Hilt를 사용하면 의존성을 쉽게 관리할 수 있으며, 코드를 더욱 간결하게 유지할 수 있습니다. Android 클래스에 @AndroidEntryPoint
로 주석을 지정하면 이 클래스에 종속된 Android 클래스에도 주석을 지정해야 합니다. 예를 들어 프래그먼트에 주석을 지정하면 이 프래그먼트를 사용하는 활동에도 주석을 지정해야 합니다.
참고: Android 클래스에 관한 Hilt 지원에는 다음과 같은 예외가 적용됩니다.
- Hilt는
AppCompatActivity
와 같은ComponentActivity
를 확장하는 활동만 지원합니다.- Hilt는
androidx.Fragment
를 확장하는 프래그먼트만 지원합니다.- Hilt는 보존된 프래그먼트를 지원하지 않습니다.
buildscript {
...
dependencies {
...
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.38.1'
}
}
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'
dependencies {
...
implementation 'com.google.dagger:hilt-android:2.38.1'
kapt 'com.google.dagger:hilt-android-compiler:2.38.1'
}
Hilt 초기 설정
import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp
class MyApplication : Application() {
}
의존성 주입 - 네트워크 연결을 수행하는 repository 클래스를 만들려고 가정했을때
import kotlinx.coroutines.flow.Flow
class NetworkRepository @Inject constructor(private val apiService: ApiService) {
fun fetchData(): Flow<Resource> {
// 네트워크 작업 수행
}
}
Hilt가 ApiService를 주입해줄걸 안다. @Inject 어노테이션을 사용하고 @Module 및 @Installn 어노테이션을 사용하여 Hilt 모듈을 생성합니다.
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@Provides
@Singleton
fun provideApiService(): ApiService {
return Retrofit.Builder()
.baseUrl("https://example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ApiService::class.java)
}
}
의존성 사용
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject
@HiltViewModel
class MyViewModel @Inject constructor(
private val networkRepository: NetworkRepository
) : ViewModel() {
fun fetchData(): Flow<Resource> = networkRepository.fetchData()
}
import androidx.activity.viewModels
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewModel by viewModels<MyViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
lifecycleScope.launch {
viewModel.fetchData().collect { resource ->
when (resource.status) {
Status.SUCCESS -> {
// 데이터를 성공적으로 가져온 경우 처리
}
Status.ERROR -> {
// 에러 발생 시 처리
}
Status.LOADING -> {
// 로딩 중일 때 처리
}
}
}
}
}
}
Flow를 사용하면 비동기 작업을 처리하는 데 유용한 도구를 제공하며, 간편한 방식으로 비동기 데이터를 처리할 수 있습니다.
더 간단한 예제
1. MessageProvider 클래스 생성
class MessageProvider {
fun provideMessage(): String {
return "Hello, Hilt!"
}
}
2. Hilt 모듈 생성
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
fun provideMessageProvider(): MessageProvider {
return MessageProvider()
}
}
3. MainActivity에 의존성 주입
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var messageProvider: MessageProvider
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
showMessage(messageProvider.provideMessage())
}
private fun showMessage(message: String) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
}
Hilt를 사용하여 MainActivity에 주입했다. 의존성이 주입된 후에는 provideMessage() 메소드를 호출해 문자열을 가져올 수 있다.
android 공식문서 :
https://developer.android.com/training/dependency-injection/hilt-android?hl=ko#kts
어렵다 ㅠㅠ
반응형
'Android' 카테고리의 다른 글
Kotlin 에서 getColor 사용하기 Deprecated in API level 23 (0) | 2023.04.19 |
---|---|
Recyclerview에 Header추가하는 방법 (0) | 2023.04.18 |
Recommend 10 sites to help developers (0) | 2023.04.07 |
Kotlin 널 안전성이란 (0) | 2023.04.03 |
안드로이드 mvp,mvvm 패턴과 샘플코드 (0) | 2023.03.09 |
댓글