如果没有@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})//