Dagger2: ошибка компиляции: не может быть предоставлена ​​без конструктора @Inject или с помощью аннотируемого метода @ Provides - PullRequest
0 голосов
/ 31 мая 2018

Я работаю над Dagger2.Я планирую иметь ту же архитектуру, определенную в этом проекте.Я получаю сообщение об ошибке ниже.

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

Я нашел и нашел пару решений для использования @Provider в AppModule .java со ссылкой, и янашел его уже там.

Я что-то упустил?

Спасибо.

1 Ответ

0 голосов
/ 31 мая 2018

Ваш компонент не знает, где взять DBHelper, поскольку никто его не предоставляет.Обратите внимание, что у вас есть провайдер для DataManager, для которого требуется экземпляр PatientDatabase.PatientDatabase помечен @Inject в конструкторе, поэтому он добавляется в график.Но проблема заключается в зависимости PatientDatabase.Чтобы решить вашу проблему, вы также должны предоставить свой экземпляр dbHelper и preferenceHelper в модуле.

Попробуйте добавить это в свой модуль

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

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

Если у вас есть фабрика, просто замените new с экземпляром.Если у вас есть существующий экземпляр, который вы хотите использовать, передайте его в модуль при создании.

...