1

Google()의 예를 따르려고했습니다. 그리고 그것은 다른 ViewModel 타입에 바인딩 할 수있는 것을 보았습니다.Dagger2를 사용하여 다중 ViewModelFactory로지도에 바인딩하는 방법

@Module 
abstract class ViewModelModule { 
    @Binds 
    @IntoMap 
    @ViewModelKey(UserViewModel.class) 
    abstract ViewModel bindUserViewModel(UserViewModel userViewModel); 

    @Binds 
    @IntoMap 
    @ViewModelKey(SearchViewModel.class) 
    abstract ViewModel bindSearchViewModel(SearchViewModel searchViewModel); 

    @Binds 
    @IntoMap 
    @ViewModelKey(RepoViewModel.class) 
    abstract ViewModel bindRepoViewModel(RepoViewModel repoViewModel); 

    @Binds 
    abstract ViewModelProvider.Factory bindViewModelFactory(GithubViewModelFactory factory); 
} 

내가 원하는 것은 다중 ViewModelProvider.Factory를 일반 바인딩으로 바인딩하는 것입니다.

@Module 
abstract class ViewModelModule { 


    @Binds 
    @IntoMap 
    @ViewModelFactoryKey(FeedEntryListViewModelFactory.class) 
    abstract ViewModelProvider.Factory bindViewModelFactory(FeedEntryListViewModelFactory factory); 

} 

는 ViewModelFactoryKey.java

@Documented 
@Target({ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME) 
@MapKey 
@interface ViewModelFactoryKey { 
    Class<? extends ViewModelProvider.Factory > value(); 
} 

FeedActivity.java는

public class FeedActivity extends DaggerAppCompatActivity { 


    @Inject 
    ViewModelProvider.Factory viewModelFactory; 

    FeedEntryListViewModel viewModel; 


    @SuppressLint("StaticFieldLeak") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    ... 
    } 
} 

그러나, 다음과 같은 오류가 발생합니다.

Error:(21, 8) error: [dagger.android.AndroidInjector.inject(T)] android.arch.lifecycle.ViewModelProvider.Factory cannot be provided without an @Provides- or @Produces-annotated method. 
android.arch.lifecycle.ViewModelProvider.Factory is injected at 
com.cn29.aac.ui.feedentry.FeedActivity.viewModelFactory 
com.cn29.aac.ui.feedentry.FeedActivity is injected at 
dagger.android.AndroidInjector.inject(arg0) 

저는 Dagger2를 처음 사용합니다. 제대로 사용하지 않으면 언제든지 의견을 말하십시오. 고맙습니다. 이에

@Inject 
ViewModelProvider.Factory viewModelFactory; 

:

+0

'내가하고 싶은이 일반 one'에 멀티 ViewModelProvider.Factory을 결합하는 것입니다 - 이것은 무엇을 의미합니까? 당신은 다양한 공장을 가지고 있으며, 당신은 그것들을지도에 넣고 싶습니까? – azizbekian

+0

예, 원합니다. 실제로 저는 다중 클래스 FeedListViewModelFactory, FeedDetailViewModelFactory를가집니다. 그러나이 액티비티에서는 주입 된 타입이 ViewModelProvider.Factory입니다. 따라서 ViewModelProvider.Factory에 매핑해야합니다. –

답변

0

당신은 다음과 같은 변경해야

@Inject 
Map<Class<? extends ViewModelProvider.Factory>, Provider<ViewModelProvider.Factory>> viewModelFactoriesMap; 
+0

지도 대신에 액티비티 클래스에 팩토리를 삽입 할 수 있습니까? –

+0

[귀하의 코멘트] (https://stackoverflow.com/questions/46601474/how-to-bind-int-map-with-multi-viewmodelfactory-using-dagger2/46603759?noredirect=1#comment80155960_46601474) 당신은 당신의 공장을지도에 넣고 싶습니다. 지금 정확히 무엇을 원하니? 어느 공장을 주사 할 것으로 예상됩니까? – azizbekian

+0

죄송합니다. 죄송합니다. 나는 Factory가 오직 맵핑이 아니라 주입 만하도록하고 싶다. Nvm, 지금 나는 dagger2에 일반적인 주사를 혼동했다. 어쨌든, 네 도움을. –