【问题标题】:Dagger2: Compile error: cannot be provided without an @Inject constructor or from an @Provides-annotated methodDagger2:编译错误:没有@Inject 构造函数或@Provides-annotated 方法无法提供
【发布时间】:2018-11-09 23:23:44
【问题描述】:

我正在开发 Dagger2。我计划在this 项目中定义相同的架构。我遇到了错误。

Error:(34, 8) error: [dagger.android.AndroidInjector.inject(T)]      
com.xyz.db.DBHelper cannot be provided without an @Inject constructor or
from an @Provides-annotated method.
com.xyz.data.local.db.DBHelper is injected at
com.xyz.data.local.db.PatientDatabase.<init>(…, dbHelper, …)
com.xyz.data.local.db.PatientDatabase is injected at
com.xyz.di.module.AppModule.provideDataManager(patientDatabase)
com.xyz.data.DataManager is injected at
com.xyz.ui.main.MainActivityModule.provideMainViewModel(dataManager)
com.xyz.ui.main.MainViewModel is injected at                               
com.ccmpat.patient.ui.main.MainActivityModule.mainViewModelProvider (mainViewModel)
android.arch.lifecycle.ViewModelProvider.Factory is injected at
com.xyz.ui.main.MainActivity.mViewModelFactory
com.xyz.ui.main.MainActivity is injected at
dagger.android.AndroidInjector.inject(arg0)

但是,AppModule .java 已经使用了@Provides 注解/

@Module
public class AppModule {
      @Provides
      @Singleton
      DataManager provideDataManager(PatientDatabase patientDatabase) {
         return patientDatabase;
      }
}

我的 AppComponent.java 看起来像

@Singleton
@Component(modules = {AndroidInjectionModule.class, AppModule.class, ActivityBuilder.class, NetworkModule.class})
public interface AppComponent {

void inject(PatientApplication app);

@Component.Builder
interface Builder {

    @BindsInstance
    Builder application(Application application);

    AppComponent build();
  }
}

PatientDatabase.java 看起来像,

@Singleton
public class PatientDatabase implements DataManager {
  private final Context mContext;
  private final DBHelper mDBDbHelper;
  private final PreferenceHelper mPreferencesHelper;

  @Inject
  public PatientDatabase(Context context, DBHelper dbHelper, PreferenceHelper preferenceHelper) {
    mContext = context;
    mDBDbHelper = dbHelper;
    mPreferencesHelper = preferenceHelper;
  }
}

我的 DBHelper.java 只是扩展了 OrmLiteSqliteOpenHelper

我在谷歌上搜索并找到了几个在 AppModule .java 中使用 @Provider 的解决方案,我发现它已经存在了。

我错过了什么吗?

谢谢。

【问题讨论】:

    标签: android mvvm data-binding dependency-injection dagger-2


    【解决方案1】:

    您的组件不知道从哪里获得 DBHelper,因为没有人提供它。请注意,您有一个DataManager 的提供者,它需要PatientDatabase 的实例。 PatientDatabase 在构造函数中用 @Inject 注释,因此它被添加到图中。但问题在于PatientDatabase 的依赖关系。为了解决您的问题,您还应该在模块中提供您的 dbHelper 和 preferenceHelper 实例。

    尝试将此添加到您的模块中

    @Provides
    DBHelper provideDbHelper() {
       return new DBHelper();
    }
    
    @Provides
    PreferenceHelper providePreferenceHelper() {
       return new PreferenceHelper();
    }
    

    如果您有工厂,只需将new 替换为实例化即可。如果您有一个想要使用的现有实例,请在创建时将其传递给模块。

    【讨论】:

    • 谢谢。有效。 PreferenceHelper 已经存在,但 DBHelper 不存在。我将确保将我们 @inject 的所有内容添加到 AppModule.java。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 2019-05-13
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多