코딩하는 일용직 노동자

ViewModelFactory 에 대해 간략히 알아보자. 본문

안드로이드

ViewModelFactory 에 대해 간략히 알아보자.

bacass 2020. 5. 26. 15:16

생성자 없이 ViewModel을 만들어 사용하는 것은 매우 간단합니다.
하지만 ViewModel을 이용하다보면 repository 나 인스턴스들을 파라메터로 넘겨서 생성하는 경우가 많습니다.

일단 간단히 name을 전달하는 ViewModel을 만들어 테스트 해보겠습니다.

class ViewModelActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_view_model)

        try {
            var viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}
class MyViewModel(_name: String): ViewModel() {

    private var name = _name

    init {
        Log.d("MyViewModel", "My name is $name")
    }
}

 

이것을 실행해보면 에러가 발생합니다.

MyViewModel을 생성하지 못하고 에러가 발생한다.

안드로이드는 Factory 클래스를 이용해 ViewModel에 원하는 파라메터를 넣어 생성하는 방법을 제공합니다.
Factory 클래스를 만들어보겠습니다.

class MyViewModelFactory(private var name: String): ViewModelProvider.Factory {

    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
            return MyViewModel(name) as T
        }
        throw IllegalArgumentException("Not found ViewModel class.")
    }
}

 

이제 준비가 끝났습니다. 파라메터를 전달한 Factory 객체를 만들어서 ViewModel을 생성합니다.

class ViewModelActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_view_model)

        try {
            val factory = MyViewModelFactory("홍길동")
            var viewModel = ViewModelProvider(this, factory).get(MyViewModel::class.java)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}

 

이제 정상적으로 작동됩니다.

MyViewModel 에 파라메터가 전달되었다.