如果没有@Providers注释方法,则无法提供Dagger android build Error

如果没有@Providers注释方法,则无法提供Dagger android build Error,android,dependency-injection,dagger-2,dagger,Android,Dependency Injection,Dagger 2,Dagger,我正在学习匕首依赖注入(我知道我参加聚会迟到了,最好现在就开始) 但我面临以下错误。如果您有任何帮助或建议,我们将不胜感激 错误日志 error: [Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T)] @com.mypackage.di.key.ItemDetail java.lang.Integer cannot be provided without an @Provides-annotated meth

我正在学习匕首依赖注入(我知道我参加聚会迟到了,最好现在就开始)

但我面临以下错误。如果您有任何帮助或建议,我们将不胜感激

错误日志

    error: [Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T)] @com.mypackage.di.key.ItemDetail java.lang.Integer cannot be provided without an @Provides-annotated method.
public interface ApplicationComponent extends AndroidInjector<RetailShopApplication> {
   ^
  @com.mypackage.di.key.ItemDetail java.lang.Integer is injected at
      com.mypackage.ui.detail.ItemDetailViewModel.<init>(…, itemId)
  com.mypackage.ui.detail.ItemDetailViewModel is injected at
      com.mypackage.di.module.ViewModelModule.provideItemDetailViewModel(itemDetailViewModel)
  java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,javax.inject.Provider<androidx.lifecycle.ViewModel>> is injected at
      com.mypackage.viewModel.ViewModelFactory.<init>(creators)
  com.mypackage.viewModel.ViewModelFactory is injected at
      com.mypackage.ui.home.ItemCategoryFragment.itemViewFactory
  com.mypackage.ui.home.ItemCategoryFragment is injected at
      dagger.android.AndroidInjector.inject(T)
component path: com.mypackage.di.component.ApplicationComponent ? com.mypackage.di.builder.ActivityBuilder_ContributeHomeActivity.HomeActivitySubcomponent ? com.mypackage.ui.home.HomeFragmentProvider_ContributeItemCategoryFragment.ItemCategoryFragmentSubcomponent
ItemDetailActivityModule

@Module
public abstract class ViewModelModule {

@Binds
@IntoMap
@ViewModelKey(ItemCategoryViewModel.class)
abstract ViewModel provideItemCategoryViewModel(ItemCategoryViewModel 
itemCategoryViewModel);

@Binds
@IntoMap//<---- Here is the new ViewModel
@ViewModelKey(ItemDetailViewModel.class)
abstract ViewModel provideItemDetailViewModel(ItemDetailViewModel 
itemDetailViewModel);

@Binds
abstract ViewModelProvider.NewInstanceFactory 
getViewModelFactory(ViewModelFactory viewModelFactory);
}
@Module
public class ItemDetailActivityModule {

  @Provides
  @ItemDetail
  int provideItemId(ItemDetailActivity itemDetailActivity) {
    return itemDetailActivity.getIntent().getIntExtra(AppConstants.ITEM_ID, 
  0);
  }

}
@Module(includes = ViewModelModule.class)
public class ApplicationModule {

   @Provides
   Application provideApplication(RetailShopApplication application) {
    return application;
   }
}
@Module
public abstract class ActivityBuilder {

   @ContributesAndroidInjector(modules = 
   {ItemDetailActivityModule.class})
   abstract ItemDetailActivity contributeItemDetailActivity();

}
ActivityBuilder

@Module
public abstract class ActivityBuilder {

@ActivityScope
@ContributesAndroidInjector(modules = {HomeFragmentProvider.class, 
HomeActivityModule.class})
abstract HomeActivity contributeHomeActivity();

@ActivityScope
@ContributesAndroidInjector(modules = ItemDetailActivityModule.class)
abstract ItemDetailActivity contributeItemDetailActivity();

}
应用程序组件

@Singleton
@Component(modules = {AndroidSupportInjectionModule.class, 
ApplicationModule.class, ActivityBuilder.class})
public interface ApplicationComponent extends 
AndroidInjector<RetailShopApplication> {

  @Component.Builder
  abstract class Builder extends 
  AndroidInjector.Builder<RetailShopApplication> {
  }

}
解决方案 问题是我在为AppModule中包含的ViewModelModule类中的每个ViewModel创建提供程序

使用@ContributeAndroidInjection创建的每个活动都是一个子组件

因此,应用程序组件和活动子组件是不同的。Activity component可以访问应用程序组件的提供商,但反之亦然,注入的原因已经存在错误

@Module
public abstract class ActivityBuilder {

@ActivityScope
@ContributesAndroidInjector(modules = {HomeFragmentProvider.class, 
HomeActivityModule.class})
abstract HomeActivity contributeHomeActivity();

@ActivityScope
@ContributesAndroidInjector(modules = ItemDetailActivityModule.class)
abstract ItemDetailActivity contributeItemDetailActivity();

}
我解决了在活动模块而不是appcomponent模块中包含视图模型的问题

ViewModelModule 之前

@Module
public abstract class ViewModelModule {

   @Binds
   @IntoMap//<---- Here is the new ViewModel
   @ViewModelKey(ItemDetailViewModel.class)
   abstract ViewModel provideItemDetailViewModel(ItemDetailViewModel 
   itemDetailViewModel);

   @Binds
   abstract ViewModelProvider.NewInstanceFactory 
   getViewModelFactory(ViewModelFactory viewModelFactory);
}
ItemDetailProvider 创建抽象类以保存ViewModel提供程序

@Module
public abstract class ItemDetailProvider {

  @Binds
  @IntoMap
  @ViewModelKey(ItemDetailViewModel.class)
  abstract ViewModel provideItemDetailViewModel(ItemDetailViewModel 
  itemDetailViewModel);

}
活动模块 现在在活动模块中添加创建的提供者,如下所示

之前

@Module
public abstract class ViewModelModule {

@Binds
@IntoMap
@ViewModelKey(ItemCategoryViewModel.class)
abstract ViewModel provideItemCategoryViewModel(ItemCategoryViewModel 
itemCategoryViewModel);

@Binds
@IntoMap//<---- Here is the new ViewModel
@ViewModelKey(ItemDetailViewModel.class)
abstract ViewModel provideItemDetailViewModel(ItemDetailViewModel 
itemDetailViewModel);

@Binds
abstract ViewModelProvider.NewInstanceFactory 
getViewModelFactory(ViewModelFactory viewModelFactory);
}
@Module
public class ItemDetailActivityModule {

  @Provides
  @ItemDetail
  int provideItemId(ItemDetailActivity itemDetailActivity) {
    return itemDetailActivity.getIntent().getIntExtra(AppConstants.ITEM_ID, 
  0);
  }

}
@Module(includes = ViewModelModule.class)
public class ApplicationModule {

   @Provides
   Application provideApplication(RetailShopApplication application) {
    return application;
   }
}
@Module
public abstract class ActivityBuilder {

   @ContributesAndroidInjector(modules = 
   {ItemDetailActivityModule.class})
   abstract ItemDetailActivity contributeItemDetailActivity();

}
之后-现在添加与上述活动相关的ViewModel,在我的案例中,它是 ItemDetailViewModel类

@Module
public abstract class ActivityBuilder {

   @ContributesAndroidInjector(modules = 
   {ItemDetailActivityModule.class,ItemDetailProvider.class})//<--- provider added in this line
   abstract ItemDetailActivity contributeItemDetailActivity();

}
@模块
公共抽象类ActivityBuilder{
@贡献Android喷油器(模块=
{ItemDetailActivityModule.class,ItemDetailProvider.class})//