如果没有@Provides注释的方法,则无法提供Dagger-android构建错误 [英] Dagger-android build errror cannot be provided without an @Provides-annotated method
问题描述
我正在学习匕首依赖注入(我知道我迟到了聚会,现在最好开始)。
I am learning dagger dependency injection(I know i am late to the party, its better to start now).
但是我面临以下错误。请给予任何帮助或建议。
But I am facing below error. Please any help or suggestion could be greatly appreciated.
错误日志
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
我的问题
我在ViewModelModule中创建了一个带有commitAndroidInjection注释的ProvideItemDetailViewModel(),但ItemDetailViewModel构造函数的值为整数。
I created a provideItemDetailViewModel() with contributeAndroidInjection annotation in ViewModelModule but the ItemDetailViewModel contructor has an integer value.
因此,我在运行时从我的活动意图
通过ItemDetailActivityModule类提供了一个整数值。问题是匕首使我
出现错误范围中已经存在整数,但无法在ViewModel构造函数中注入
。
So i am providing an integer value at runtime from my activity intent through ItemDetailActivityModule class. Problem is dagger throwing me an error "integer already exist in the scope" but not able to inject in the ViewModel contructor.
ViewModelModule
@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);
}
ItemDetailViewModel
@Inject
public ItemDetailViewModel(Application application, @ItemDetail int itemId)
{
itemRepository = new ItemRepository(application);
itemLiveData = itemRepository.getItem(itemId);
}
ItemDetailActivityModule
@Module
public class ItemDetailActivityModule {
@Provides
@ItemDetail
int provideItemId(ItemDetailActivity itemDetailActivity) {
return itemDetailActivity.getIntent().getIntExtra(AppConstants.ITEM_ID,
0);
}
}
ActivityBuilder
@Module
public abstract class ActivityBuilder {
@ActivityScope
@ContributesAndroidInjector(modules = {HomeFragmentProvider.class,
HomeActivityModule.class})
abstract HomeActivity contributeHomeActivity();
@ActivityScope
@ContributesAndroidInjector(modules = ItemDetailActivityModule.class)
abstract ItemDetailActivity contributeItemDetailActivity();
}
ApplicationComponent
@Singleton
@Component(modules = {AndroidSupportInjectionModule.class,
ApplicationModule.class, ActivityBuilder.class})
public interface ApplicationComponent extends
AndroidInjector<RetailShopApplication> {
@Component.Builder
abstract class Builder extends
AndroidInjector.Builder<RetailShopApplication> {
}
}
ApplicationModule
@Module(includes = ViewModelModule.class)
public class ApplicationModule {
@Provides
Application provideApplication(RetailShopApplication application) {
return application;
}
}
推荐答案
解决方案
问题是我正在为AppModule中包含的ViewModelModule类中的每个ViewModel创建提供程序。
Solution
Problem is i was creating provider for each ViewModel in ViewModelModule class which is included in AppModule.
每个活动使用@ContributeAndroidInjection创建的是子组件。
Every Activity created using @ContributeAndroidInjection is a sub component.
因此App组件和Activity子组件是不同的。活动组件可以访问应用程序组件的提供者,但反之亦然,即注入的原因已存在错误
So App component and Activity sub component are different. Activity component can access provider of App component but its not vice versa that the reason for injection already exist error
我解决了包含视图的问题
I solved the problem my including view model inside the activity module instead of appcomponent module.
之前
@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);
}
之后-在ViewModelModule移动中仅需要ViewModelFactory
After - Only ViewModelFactory is necessary in ViewModelModule move all your ViewModel provider to activity module.
@Module
public abstract class ViewModelModule {
@Binds
abstract ViewModelProvider.NewInstanceFactory
getViewModelFactory(ViewModelFactory viewModelFactory);
}
ItemDetailProvider
创建Abstract类以容纳ViewModel提供程序
ItemDetailProvider
Create Abstract class in order to hold the ViewModel providers
@Module
public abstract class ItemDetailProvider {
@Binds
@IntoMap
@ViewModelKey(ItemDetailViewModel.class)
abstract ViewModel provideItemDetailViewModel(ItemDetailViewModel
itemDetailViewModel);
}
ActivityModule
现在在活动模块中添加创建的提供者,如下所示
ActivityModule
Now add the created provider in the Activity module as shown below
之前
@Module
public abstract class ActivityBuilder {
@ContributesAndroidInjector(modules =
{ItemDetailActivityModule.class})
abstract ItemDetailActivity contributeItemDetailActivity();
}
之后-现在,添加在我的案例中,与上述活动相对应的ViewModel是
ItemDetailViewModel类
After - Now add the ViewModel that corespond to the above activity in my case it is ItemDetailViewModel class
@Module
public abstract class ActivityBuilder {
@ContributesAndroidInjector(modules =
{ItemDetailActivityModule.class,ItemDetailProvider.class})//<--- provider added in this line
abstract ItemDetailActivity contributeItemDetailActivity();
}
这篇关于如果没有@Provides注释的方法,则无法提供Dagger-android构建错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!