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.
'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
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. –