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的新手。如果使用不当,请随时发表评论。谢谢。

+0

'我想要做的就是多ViewModelProvider.Factory绑定到通用one' - 这是什么意思?你有各种工厂,你想把它们放到地图上? – azizbekian

+0

是的,我想要它。其实我有多个类FeedListViewModelFactory,FeedDetailViewModelFactory ...但在这些活动中,注入类型是ViewModelProvider.Factory。因此,我需要将两者都映射到ViewModelProvider.Factory。 –

回答

0

你必须改变如下:

@Inject 
ViewModelProvider.Factory viewModelFactory; 

要这样:

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

我不能在Activity类中注入Factory而不是Map吗? –

+0

你在[你的评论](https://stackoverflow.com/questions/46601474/how-to-bind-int-map-with-multi-viewmodelfactory-using-dagger2/46603759?noredirect=1#comment80155960_46601474)你告诉,你想把你的工厂放到地图上。你现在想要什么?你希望注入哪个工厂? – azizbekian

+0

哎呀,对不起,我的坏回复。我想只有工厂注入,而不是映射。 Nvm,现在我认为我对dagger2上的通用注入感到困惑。无论如何,thx为您提供帮助。 –

相关问题