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