String을 주입할 때처럼 @Provides 를 사용하여 hilt가 어떤 것을 주입해야 하는지를 지정할 수 있다.
하지만 String과 다르게 위 클래스는 사용자가 직접 정의한 클래스이므로 여러 개 존재하지 않는다.
class Data @Inject constructor() {
var a = 10
fun set(){
Log.d("test5", "set: $a")
a = 20
}
fun get(){
Log.d("test5", "get: $a")
}
}
따라서 @Inject 을 통해 생성자 파라미터로 어떠한 것이 필요한지 명시해주면 (위 경우는 생성자 파라미터 X)
따로 @Provides 코드를 작성하지 않아도
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var data : Data
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}
}
hilt는 Data 클래스를 알아서 주입해준다.
따라서 위와 같이 사용할 액티비티에서 @Inject 하여 사용할 수 있다.
따라서 처음에 살펴본@Provides로 전달하는 방법은@Singleton 를 사용하여 싱글톤으로 클래스 객체를 생성할 때 등 클래스를 기본적으로 생성하지 않을 때 사용할 수 있다.
Class 생성자 파라미터 주입
class Data @Inject constructor(
@Named("String1") private val str: String
) {
var a = 10
init {
Log.d("test5", "string: $str")
}
fun set(){
Log.d("test5", "set: $a")
a = 20
}
fun get(){
Log.d("test5", "get: $a")
}
}
위와 같이 필요한 생성자 파라미터를 정의해주면 Hilt가 주입해준다.
❓ Hilt가 자동으로 주입해주는 부분에 직접 파라미터를 넣어도 될까?
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var data : Data
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
data.set()
val data2 = Data("test")
data2.get()
}
}