개발/안드로이드
ViewModelProviders.of deprecated
kwony
2020. 4. 6. 15:01
ViewModel을 주입할 때 주로 사용하는 ViewModelProviders 클래스는 lifecycle-extension 라이브러리가 2.2.0 버전업 되면서 통째로 Deprecated가 됐다. 하지만 ViewModelProvider(뒤에 s만 빠진 클래스가 맞다) 클래스를 통해 동일한 기능을 수행하도록 할 수 있다.
BEFORE
@Module(includes = [BaseActivityModule::class])
abstract class MainActivityModule {
@Binds
abstract fun provideActivity(activity: MainActivity): FragmentActivity
@Module
companion object {
@Provides
@JvmStatic
fun provideViewModel(activity: FragmentActivity, viewModelFactory: ViewModelFactory): MainViewModel
= ViewModelProviders.of(activity).get(MainViewModel::class.java)
}
}
AFTER
@Module(includes = [BaseActivityModule::class])
abstract class MainActivityModule {
@Binds
abstract fun provideActivity(activity: MainActivity): FragmentActivity
@Module
companion object {
@Provides
@JvmStatic
fun provideViewModel(activity: FragmentActivity, viewModelFactory: ViewModelFactory): MainViewModel
= ViewModelProvider(activity, viewModelFactory).get(MainViewModel::class.java)
}
}
fragment의 부모 activity 를 넘겨서 fragment와 activity가 동일한 viewmodel을 바라보게하는 기능도 정상적으로 동작한다
@Module(includes = [BaseFragmentModule::class])
abstract class PayFragmentModule {
@Binds
abstract fun provideFragment(fragment: PayFragment): Fragment
@Module
companion object {
@Provides
@JvmStatic
fun provideViewModel(fragment: Fragment, viewModelFactory: ViewModelFactory): PartyViewModel
= ViewModelProvider(fragment.requireActivity(), viewModelFactory).get(PartyViewModel::class.java)
}
}
함수단위면 몰라도 클래스 하나를 통째로 Deprecated 하는 것은 흔치 않는 일인 것 같은데 기존에 있는 ViewModelProvider 클래스에만 집중해서 개선하기 위함이지 않을까 조심스럽게 추측해본다. 그리고 기존에 있던 ViewModelProviders 코드도 대부분 ViewModelProvider를 호출하는 형태였기 때문에 둘이 겹치는 점도 많았던 것 같고.