코딩하는 일용직 노동자

ViewModelProvider.Factory를 이용해 파라메터가 있는 ViewModel 생성하기. 본문

안드로이드

ViewModelProvider.Factory를 이용해 파라메터가 있는 ViewModel 생성하기.

bacass 2024. 3. 15. 14:04
액티비티나 프래그먼트 내에서 ViewModel을 사용하려면 ViewModelProvider를 이용해 ViewModel을 생성해 사용할 수 있습니다.
ViewModel을 생성할때는 파라메터가 있을때와 없을때의 생성방법이 차이가 있습니다.
 
파라메터가 없는 ViewModel은 아래처럼 생성이 가능합니다.
val viewModel: MainActivityViewModel by lazy {
	ViewModelProvider(this)[MainActivityViewModel::class.java]
}
하지만 MainActivityViewModel의 생성자에 파라메터가 있다면 위 방법으로 객체생성이 안됩니다.
 

 
테스트를 위해 Int형의 파라메터를 받는 MainActivityViewModel 클래스를 만들어보겠습니다.
import androidx.lifecycle.ViewModel

class MainActivityViewModel(defaultCount: Int): ViewModel() {
    private var totalCount = 0

    init {
        totalCount = defaultCount
    }

    fun getCount(): Int{
        return totalCount
    }

    fun addCount(count : Int){
        totalCount += count
    }
}
ViewModel 클래스를 상속하여 정의한 클래스는 개발자가 직접 생성자를 통하여서 객체를 생성할 수 없습니다.
ViewModelProvider.Factory 인터페이스를 구현해서 생성해야합니다.

우선 ViewModelProvider.kt 파일의 Factory 인터페이스 소스를 살펴보겠습니다.
ViewModel객체 T를 리턴하는 create() 를 구현해서 사용하도록 되어 있는것을 알 수 있습니다.
 
 
이제 파라메터를 전달받을 MainViewModelFactory를 ViewModelProvider.Factory 인터페이스를 상속받아 생성해봅시다.
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider

class MainViewModelFactory(val count: Int): ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if(modelClass.isAssignableFrom(MainActivityViewModel::class.java)){
            return MainActivityViewModel(defaultCount = count) as T
        }
        throw IllegalArgumentException()
    }
}
MainViewModelFactory를 만들었으니 이제 MainActivityViewModel의 객체를 생성해 사용해보겠습니다.
class MainActivity : ComponentActivity() {

    private lateinit var viewModelFactory: MainViewModelFactory
    private lateinit var viewModel: MainActivityViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {

            viewModelFactory = MainViewModelFactory(count = 15)
            viewModel = ViewModelProvider(this, viewModelFactory).get(MainActivityViewModel::class.java)

            viewModel.addCount(20)
            viewModel.addCount(2)
            viewModel.addCount(9)

            Log.d("MainActivity", "total count is ${viewModel.getCount()}")
        }
    }
}

정상적으로 viewModel 객체가 생성되어 동작하는 것을 확인했습니다.