• 로그인 함 해보끄나?

  • Sarangnamu.net June 17, 2003
    Home Login Profile Study Open Project Q&A Google Code
    AbstractSavedStateViewModelFactory 분석
    Last Modify : 28 August, 2019(06:13)
    보다 보니 inject 는 고려하지 않고 코드 해놓은거 같은 느낌... 뭐 당연하지만 ;;;; 일단 ViewModelProvider 를 생성하고 기본적으로 default factory 로 viewmodel 을 ViewModelStoreOwner 에 생성하는데 dagger 를 이용해야 할 경우 보통 ViewModelProvider.Factory 를 상속해서 이를 이용 한다. 인터넷에 주로 돌아 다니는 코드를 참조해서 나도 사용하고 있는 중인데 /** * https://medium.com/@marco_cattaneo/android-mViewModel-and-factoryprovider-good-way-to-manage-it-with-dagger-2-d9e20a07084c */ @Singleton class DaggerViewModelFactory @Inject constructor( private val creator: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>> ) : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T { return creator[modelClass]?.get() as? T ?: throw IllegalArgumentException("unknown model class $modelClass") as Throwable } } ViewModelProvider 에서 사용자가 get(viewmodel) 을 요청 하면 아래의 코드를 거치게 된다. key 이 경우 내부 규칙에 의해 설정 되며 modelClass 가 대상이 되는데 이미 인스턴스 되어 있는 경우 mViewModelStore 있는걸 반환하고 아니라면 새로 인스턴스를 해야 하는데 @SuppressWarnings("unchecked") @NonNull @MainThread public <T extends ViewModel> T get(@NonNull String key, @NonNull Class<T> modelClass) { ViewModel viewModel = mViewModelStore.get(key); if (modelClass.isInstance(viewModel)) { return (T) viewModel; } else { //noinspection StatementWithEmptyBody if (viewModel != null) { // TODO: log a warning. } } if (mFactory instanceof KeyedFactory) { viewModel = ((KeyedFactory) (mFactory)).create(key, modelClass); } else { viewModel = (mFactory).create(modelClass); } mViewModelStore.put(key, viewModel); return (T) viewModel; } AbstractSavedStateViewModelFactory 이 KeyedFactory 를 상속하고 있어 viewModel = ((KeyedFactory) (mFactory)).create(key, modelClass); 코드를 타게 된다. 이후 아래를 호출하게 되고 사용자가 구현해야 할 부분이 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) @NonNull @Override public final <T extends ViewModel> T create(@NonNull String key, @NonNull Class<T> modelClass) { Bundle restoredState = mSavedStateRegistry.consumeRestoredStateForKey(key); SavedStateHandle handle = SavedStateHandle.createHandle(restoredState, mDefaultArgs); SavedStateHandleController controller = new SavedStateHandleController(key, handle); controller.attachToLifecycle(mSavedStateRegistry, mLifecycle); T viewmodel = create(key, modelClass, handle); viewmodel.setTagIfAbsent(TAG_SAVED_STATE_HANDLE_CONTROLLER, controller); mSavedStateRegistry.runOnNextRecreation(OnRecreation.class); return viewmodel; } 이거 인데 SavedStateHandle handle 를 여기다 던져주니 일반적인 방법으로 inject 할 수가 없다. -_ - 젠장 Application 은 전역으로 땡겨준다 치지만 SavedStateHandle 이 녀석 =_ = ;;; @NonNull protected abstract <T extends ViewModel> T create(@NonNull String key, @NonNull Class<T> modelClass, @NonNull SavedStateHandle handle); 짱돌을 굴려 SavedStateHandle 를 Provides 할까 싶었는데 필요한게 key, class 도 필요하다보니.. =_ = 정말 AssistedInject 써야 되는거뉘?

    Comment


    입력하3 1591477529



    Locations of visitors to this page