Dagger 2 возвращает null после инъекции

Я пытаюсь сделать инъекцию с помощью 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();
    }
...

Что я делаю неправильно ? Почему объекты всегда нулевые?

Вы добавили обработчик аннотаций кинжала в свой build.gradle?

Stephen 09.04.2018 17:40

Конечно: скомпилируйте 'com.google.dagger: dagger: 2.7' annotationProcessor 'com.google.dagger: dagger-compiler: 2.7'

abrutsze 09.04.2018 17:41
1
2
775
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны специально указать кинжалу, какое действие будет здесь введено, а не использовать суперкласс 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, а затем использовать отдельный выделенный механизм для установки делегата.

Stephen 10.04.2018 07:59

Ах. Похоже, вы догадались. Отлично :) Мой комментарий сейчас не отвечает на вашу удаленную ошибку, но я все равно оставлю его.

Stephen 10.04.2018 08:01

Другие вопросы по теме