Я пытаюсь сделать инъекцию с помощью Dagger 2, но он всегда возвращает null. Думаю, у меня все хорошо, но все равно не получается.
Вот класс приложения:
public class ApplicationSA extends Application {
private static AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
appComponent = DaggerAppComponent.create();
}
public static AppComponent getComponent() {
return appComponent;
}
}
Интерфейс компонента:
@Component(modules = {
SnoreDetectorClass.class,
AudioRecorderClass.class
})
public interface AppComponent {
void injectsMainFunctionalityActivity(Activity activity);
}
Основной класс, в котором я пытаюсь получить объект:
public class MainFunctionalityActivity extends AppCompatActivity {
@Inject
AudioRecorderClass audioRecorderClass;
@Inject
SnoreDetectorClass snoreDetectorClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
ApplicationSA.getComponent().injectsMainFunctionalityActivity(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("TESTING","audioRecorderClass= "+audioRecorderClass); // always null
Log.d("TESTING","snoreDetectorClass= "+snoreDetectorClass); // always null
...
}
А вот классы модулей:
@Module
public class AudioRecorderClass {
public interface AudioRecorderInterface {
void AudioRecorder_hasUpdate(double amplitude_in_dB);
}
public AudioRecorderInterface delegate = null;
@Provides
AudioRecorderClass provideAudioRecorderClass(Activity activity) {
delegate = (AudioRecorderInterface)activity;
return new AudioRecorderClass();
}
...
@Module
public class SnoreDetectorClass {
@Provides
SnoreDetectorClass provideSnoreDetectorClass() {
return new SnoreDetectorClass();
}
...
Что я делаю неправильно ? Почему объекты всегда нулевые?
Конечно: скомпилируйте 'com.google.dagger: dagger: 2.7' annotationProcessor 'com.google.dagger: dagger-compiler: 2.7'
Вы должны специально указать кинжалу, какое действие будет здесь введено, а не использовать суперкласс Activity, а скорее вашу собственную реализацию класса Activity:
void injectsMainFunctionalityActivity(Activity activity);
изменить на:
void injectsMainFunctionalityActivity(MainFunctionalityActivity activity);
Ах, я вижу, что здесь происходит. Вы не можете вводить в подкласс. Итак, в вашем AppComponent у вас не может быть
void injectsMainFunctionalityActivity(Activity activity);
вы должны вводить
void injectsMainFunctionalityActivity(MainFunctionalityActivity activity);
В качестве побочного примечания я бы посоветовал не комбинировать ваш инжектор и ваш класс модели. Лучше разделение забот. Держите их отдельно
Как и сказано в ошибке. Вы пытаетесь предоставить экземпляр AudioRecorderClass, но ваш провайдер (лукаво) говорит, что для предоставления AudioRecorderClass требуется MainFunctionalityActivity. Так что нужен способ обеспечить это. Однако у вас нет провайдера для этой деятельности (и вам не следует). Вот почему вы должны выделить свой модуль из AudioRecorderClass (а также SnoreDetectorClass) в отдельный модуль. Вы можете удалить MainFunctionalityActivity в качестве параметра в ваших @Provides, а затем использовать отдельный выделенный механизм для установки делегата.
Ах. Похоже, вы догадались. Отлично :) Мой комментарий сейчас не отвечает на вашу удаленную ошибку, но я все равно оставлю его.
Вы добавили обработчик аннотаций кинжала в свой build.gradle?