gradle에 세팅이 끝났다면 설정을 진행해보자
생각보다 어렵지 않으니 다음을 따라해보길 바란다.
먼저 Application을 상속받는 class를 하나 만들어 다음과 같이 설정해 주자.
@HiltAndroidApp
class MyApp :Application() {
}
@HiltAndroidApp 이라는 어노테이션으로 나는 hilt를 쓸꺼에요~ 라고 선언한다고 생각하면 된다.
manifest에도 등록하는것을 잊지말자
...
<application
android:name=".MyApp"
...
</application>
Hilt는 현재 다음 Android 클래스를 지원한다.
- Application(@HiltAndroidApp을 사용하여)
- ViewModel(@HiltViewModel을 사용하여)
- Activity
- Fragment
- View
- Service
- BroadcastReceiver
Activty / Fragment 에서 사용하기 위해서는 @AndroidEntryPoint 어노테이션을 사용하면 된다.
이는 나는 여기에 주입을 할거에요~ 라고 선언한다 생각하면된다.
@AndroidEntryPoint
class MainActivity : AppCompactActivity() {
}
@AndroidEntryPoint
class MainFragment : Fragment() {
}
주입방법은 간단하다.
@AndroidEntryPoint
class MainActivity : AppCompactActivity() {
@Inject lateint var myModule : MyModule
}
@Inject 를 통해 주입시킬수있으며, 주입되는 대상은 private할 수 없다.
class AnalyticsAdapter @Inject constructor(
private val service: AnalyticsService
) { ... }
@Inject construcotr()을 이용하여 주입이 가능하다.
위의 코드의 경우 AnalyticsService에 대한 제공방법 또한 알고있어야한다.
위의 class 생성과 동일하나 @HiltViewModel 어노테이션을 추가해준다.
@HiltViewModel
class MyViewModel
@Inject constructor(
private val myRepository: MyRepository,
) : ViewModel() {
}
@Binds 와 @Provides 두개가 있다.
@Module 어노테이션을 통해 모듈임을 알려주고
InstallIn을 통해 설치 위치를 정한다
Hilt 구성요소 | 인젝터 대상 |
---|---|
SingletonComponent | Application |
ActivityRetainedComponent | N/A |
ViewModelComponent | ViewModel |
ActivityComponent | Activity |
FragmentComponent | Activity |
ViewComponent | View |
ViewWithFragmentComponent | @WithFragmentBindings 주석이 지정된 View |
ServiceComponent | Service |
인터페이스를 주입시킬때 사용한다. (애는 별로 사용을 안해봐서 잘모르겠다.)
interface AnalyticsService {
fun analyticsMethods()
}
// Constructor-injected, because Hilt needs to know how to
// provide instances of AnalyticsServiceImpl, too.
class AnalyticsServiceImpl @Inject constructor(
...
) : AnalyticsService { ... }
@Module
@InstallIn(ActivityComponent::class)
abstract class AnalyticsModule {
@Binds
abstract fun bindAnalyticsService(
analyticsServiceImpl: AnalyticsServiceImpl
): AnalyticsService
}
09.30 추가
인터페이스를 주입시킬때 어떻게 적용시킬수 알수 없기때문에 class를 만들어 주입할수 있게 합니다.
주로 사용하는듯하다, Retrofit,Room같은 것도 모듈화 시켜 주입이 가능하다.
@Module
@InstallIn(ActivityComponent::class)
object AnalyticsModule {
@Provides
fun provideAnalyticsService(
// Potential dependencies of this type
): AnalyticsService {
return Retrofit.Builder()
.baseUrl("https://example.com")
.build()
.create(AnalyticsService::class.java)
}
}
Provide 형태로 가장 많이 만들어 쓰는듯 하다