如果没有@Provides注释的方法,则无法提供Dagger-android构建错误 [英] Dagger-android build errror cannot be provided without an @Provides-annotated method

查看:108
本文介绍了如果没有@Provides注释的方法,则无法提供Dagger-android构建错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆