-
ViewModelProviders.of deprecated개발/안드로이드 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를 호출하는 형태였기 때문에 둘이 겹치는 점도 많았던 것 같고.
'개발 > 안드로이드' 카테고리의 다른 글
Exoplayer2 사용하기 (0) 2020.04.12 FragmentManagers Android (1) 2020.04.06 Exoplayer에 stetho 적용하기 (0) 2020.03.16 MotionLayout 으로 간단하게 animation 만들기 (0) 2020.03.08 RxJava: Subject, PublishSubject, BehaviorSubject (0) 2020.02.15