1

J'ai essayé de suivre l'exemple du google(). Et j'ai vu qu'il peut se lier à différents types ViewModel au générique.Comment lier dans la carte avec multi ViewModelFactory en utilisant Dagger2

@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); 
} 

Ce que je veux faire est de lier plusieurs ViewModelProvider.Factory générique à celui générique.

@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) { 
    ... 
    } 
} 

Cependant, il jette l'erreur suivante.

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) 

Je suis nouveau à Dagger2. S'il n'est pas utilisé correctement, n'hésitez pas à commenter. Je vous remercie.

+0

'Ce que je veux faire est de lier plusieurs ViewModelProvider.Factory à la One' générique - qu'est-ce que cela signifie? Vous avez différentes usines, et vous voulez les mettre dans une carte? – azizbekian

+0

Oui, je le veux. En fait, j'ai plusieurs classes FeedListViewModelFactory, FeedDetailViewModelFactory ... Mais dans ces activités, le type injecté est ViewModelProvider.Factory. Par conséquent, j'ai besoin de mapper les deux à ViewModelProvider.Factory. –

Répondre

0

Vous devez changer suivant:

@Inject 
ViewModelProvider.Factory viewModelFactory; 

à ceci:

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

Est-ce que je ne peux pas injecter Factory au lieu de Map dans la classe Activity? –

+0

Dans [votre commentaire] (https://stackoverflow.com/questions/46601474/how-to-bind-into-map-with-multi-viewmodelfactory-using-dagger2/46603759?noredirect=1#comment80155960_46601474) vous avez dit, que vous voulez mettre vos usines dans une carte. Que veux-tu exactement maintenant? Quelle usine prévoyez-vous d'être injecté? – azizbekian

+0

Oups, Désolé pour ma mauvaise réponse. Je voudrais que l'usine soit injectée seulement, pas la cartographie. Nvm, maintenant je pensais que j'ai confondu sur l'injection générique sur dagger2. Quoi qu'il en soit, merci pour votre aide. –