如何使用Dagger2

时间:2017-10-06 08:26:42

标签: java android dagger-2 dagger android-architecture-components

我试图效仿谷歌(ViewModelModule)的例子。我看到它可以绑定到不同的ViewModel类型到通用的。

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

1 个答案:

答案 0 :(得分:0)

您必须更改以下内容:

@Inject
ViewModelProvider.Factory viewModelFactory;

对此:

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