Android Jetpack

Android ViewModel - 5 (ViewModel Factory)

----___<<<<< 2021. 12. 24. 23:16

 ViewModel을 공부하다 보면, ViewModel Factory라는 것이 나옵니다. 

 

 이 ViewModel Factory라는 것이 무엇인지 한번 짚고 넘어가겠습니다.

 

 일단 기존의 ViewModel의 코드를 보면서 한번 생각해보면

 

class BlankFragmentViewModel : ViewModel() {
var countValue = 0
}
view raw ViewModel.kt hosted with ❤ by GitHub

 위의 같이 ViewModel에서 어떠한 파라메터를 받지 않고 생성이 됩니다.

 

 만약에 ViewModel에 생성자로 파라메터를 넘겨줄 때 어떻게 해야할까요? 그 때문에 ViewModel Factory라는 개념이 나왔습니다.

 

 DataSource나 reposifoty를 viewModel에 파라메터로 넘겨주기 위해서 사용합니다.

 

 그렇다면 어떻게 사용할까요? 한번 살펴보겠습니다.

 

 저는 MainViewModel에 startNum이라는 값을 넘겨주기 위해 ViewModel을 만들었습니다.

 

class MainViewModel(startNum : Int) : ViewModel() {
var num = startNum
}

 그리고, ViewModelFactory를 만들어보고

 

class MainViewModelFactory(private val startNum : Int) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if(modelClass.isAssignableFrom(MainViewModel::class.java)) {
return MainViewModel(startNum) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}

   MainActivity에서 연결해줍니다.

 

class MainActivity : AppCompatActivity() {
private val TAG = MainActivity::class.java.simpleName
lateinit var binding : ActivityMainBinding
lateinit var viewModel: MainViewModel
lateinit var viewModelFactory: MainViewModelFactory
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
viewModelFactory = MainViewModelFactory(100)
viewModel = ViewModelProvider(this,viewModelFactory).get(MainViewModel::class.java)
Log.d(TAG, viewModel.num.toString())
}
}
view raw MainActivity.kt hosted with ❤ by GitHub

 이렇게 하면, 저희가 원하는 형태로 파라메터를 넘겨줄 수 있습니다.

 

 

 

-- 참조

 

https://developer.android.com/codelabs/kotlin-android-training-view-model#7

 

Android Kotlin Fundamentals: 5.1 ViewModel  |  Android Developers

In this codelab, you learn how to use ViewModel to enable data to survive configuration changes such as screen rotations in your Android Kotlin app.

developer.android.com