1

Ich habe versucht, das Beispiel der Google() zu folgen. Und ich habe gesehen, dass es an verschiedene ViewModel-Typen an die generischen binden kann.Wie in Map mit Multi ViewModelFactory mit Dagger2 binden

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

Was ich tun möchte, ist, Multi ViewModelProvider.Factory an die allgemeine zu binden.

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

Allerdings wirft es den folgenden Fehler.

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) 

Ich bin neu in Dagger2. Wenn es nicht richtig verwendet wird, können Sie gerne einen Kommentar abgeben. Vielen Dank.

+0

'Was ich tun möchte, ist Multi ViewModelProvider.Factory dem Ober one' zu ​​binden - was bedeutet das? Sie haben verschiedene Fabriken, und Sie möchten sie in eine Karte einfügen? – azizbekian

+0

Ja, ich will es. Eigentlich habe ich mehrere Klassen FeedListViewModelFactory, FeedDetailViewModelFactory ... Aber in diesen Aktivitäten ist der injizierte Typ ViewModelProvider.Factory. Daher muss ich beide der ViewModelProvider.Factory zuordnen. –

Antwort

0

Sie haben folgende Änderungen:

@Inject 
ViewModelProvider.Factory viewModelFactory; 

Um dies:

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

Kann ich Factory statt Map nicht in die Aktivitätsklasse injizieren? –

+0

In [Ihr Kommentar] (https://stackoverflow.com/questions/46601474/how-to-bind-into-map-with-multi-viewmodefactory-using-dagger2/46603759?noredirect=1#comment80155960_46601474) haben Sie gesagt, dass Sie Ihre Fabriken in eine Karte einfügen möchten. Was genau willst du jetzt? In welche Fabrik soll gespritzt werden? – azizbekian

+0

Hoppla, Entschuldigung für meine schlechte Antwort. Ich möchte die Factory nur injizieren lassen, nicht das Mapping. Nvm, jetzt dachte ich, ich hätte bei der generischen Injektion auf dagger2 verwirrt. Wie auch immer, Danke für Ihre Hilfe. –

Verwandte Themen