티스토리 뷰
Dagger를 통해 의존성 주입을 하던 중에, 같은 타입의 여러 객체를 제공하기 위해 @Named 어노테이션을 사용했는데, 다음과 같은 에러로 빌드가 되지 않았다.
error: [Dagger/MissingBinding] @javax.inject.Named("identifier") someObject cannot be provided without an @Provides-annotated method.
원인
코틀린에서 프로퍼티(Property)는 기본적으로 필드(Field)와 접근자(getter/setter)로 구성되어 있다.
그러나 자바는 필드(Field)만 존재하고 접근자는 별도로 구현해야 한다. 그렇기 때문에 코틀린의 어노테이션(annotation)은 자바와 같은 동작을 보장하기 위해 내부적으로 조금 더 복잡하다고 한다.
우리가 원하는 것은 "프로퍼티(Property) 주입"이지만 Dagger에서는 "필드(Field)를 주입한다"라고 알아듣는다고 한다.
해결방법
해결방법은 의외로 간단했다.
객체를 제공하는 모듈(Module)에서는 다음과 같이 @Named("Identifier") 형식으로 어노테이션을 붙여주면 된다.
그리고 외부 접근을 위해 @JvmStatic 어노테이션도 함께 선언해야 한다.
@Module
abstract class PreferenceModule {
@Module
companion object {
@Provides
@Singleton
@Named("bluetooth")
@JvmStatic // important!!!
fun provideBlePreference(applicationContext: Context): RxkPrefs
= rxkPrefs(applicationContext, "bluetooth")
}
}
주입받는 곳에서는 @field:Named("Identifier") 형식으로 어노테이션을 붙여주면 된다.
class MyViewModel @Inject constructor(): ViewModel() {
@Inject @field:Named("bluetooth")
lateinit var blePrefs: RxkPrefs
}
이외로
드물게 Primitive 타입을 주입할 경우에는 @set:Named("Identifier") 어노테이션을 붙여주면 된다고 한다.
reference: https://medium.com/@WindRider/correct-usage-of-dagger-2-named-annotation-in-kotlin-8ab17ced6928
'Android' 카테고리의 다른 글
안드로이드 기본 지식 (면접 대비) (0) | 2021.01.07 |
---|---|
CoordinatorLayout + ViewPager 사용 시 스크롤 이상 현상 (4) | 2019.12.16 |
[안드로이드] 전화번호(String)로 Call Intent 호출하기 (0) | 2016.11.11 |
TabLayout에서 탭 색상 변경이 안될 때 (Tablayout.setBackgroundColor) (0) | 2016.10.17 |
[Android] 안드로이드 키보드가 특정 레이아웃을 위로 숨길 때 해결법 (0) | 2016.07.14 |
- Total
- Today
- Yesterday
- DI
- CentOS NGINX PHP
- Android
- NGINX PHP FPM
- Dagger
- NGINX PHP 연동
- kotlin
- provides
- 부트캠프
- 부트로더
- dependency injection
- bootcamp
- NestedScrollView
- GPT
- CoordinatorLayout
- UEFI
- inject
- 복구
- Repair
- EFI
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |