ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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를 호출하는 형태였기 때문에 둘이 겹치는 점도 많았던 것 같고. 

    댓글

Designed by Tistory.