Dagger 2.15 - Как внедрить зависимость в класс приложения

Я не могу внедрить зависимость в класс DaggerApplication

Соответствующие классы следующие

Заявление

class App : DaggerApplication() {

@Inject lateinit var mSomeClass : SomeClass // This is always NULL

override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
    return DaggerAppComponent.builder().application(this).build()
 }


override fun onCreate() {
    super.onCreate()

    mSomeClass.initialize()  // mSomeClass is NULL
}

Составная часть:

 @Singleton
 @Component(modules = [
    AndroidSupportInjectionModule::class,
    AppModule::class,
    ViewModelFactoryModule::class,
    BuildersModule::class
  ])
interface AppComponent : AndroidInjector<DaggerApplication> {

@Component.Builder
interface Builder {

    @BindsInstance
    fun application(application: Application): Builder

    fun build(): AppComponent
    }
}

AppModule класс:

    @Module
    class AppModule {

    @Provides
    fun provideSomeClass(context: Context) = SomeClass(context = context)
}

Не уверен, чего не хватает.

у вас есть смесь java и kotlin, пожалуйста, укажите язык, который вы пытаетесь

crgarridos 29.05.2018 18:20
void inject(App app); и appComponent.inject(this)
EpicPandaForce 29.05.2018 20:13

Пожалуйста, включите свой компонентный интерфейс.

David Medenjak 29.05.2018 20:27

@EpicPandaForce, не могли бы вы подробнее рассказать о своем заявлении?

silent_control 29.05.2018 21:10

Совершенно уверен, что это должен быть interface AppComponent : AndroidInjector<App>

David Medenjak 29.05.2018 22:12

@silent_control можешь найти решение? у меня та же проблема

ysfcyln 15.08.2018 12:52
12
6
4 943
2

Ответы 2

Вы должны реализовать HasActivityInjector и его методы. Пример ниже. Надеюсь сработает.

class App : Application(), HasActivityInjector {

@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

override fun onCreate() {
    super.onCreate()

    DaggerAppComponent
            .builder()
            .create(this)
            .inject(this)
}

override fun activityInjector(): AndroidInjector<Activity>? {
    return dispatchingAndroidInjector
}
}

Я испытал ту же проблему и выяснил, что мы не можем вызвать inject(this) в классе Application при использовании DaggerApplication в AppComponent. Из-за этого, думаю, мы не можем ничего вводить.

Итак, в AppComponent вы должны указать свой класс Application вместо того, чтобы вводить DaggerApplication

Ваш AppComponent должен быть таким

@Singleton
@Component(modules = {AndroidSupportInjectionModule.class, AppModule.class})
public interface AppComponent extends AndroidInjector<MyApplication> {

    @Component.Builder
    interface Builder {

        @BindsInstance
        Builder application(Application application);
        AppComponent build();

    }

}

И ваш класс Application

    public class MyApplication extends DaggerApplication {

        @Inject
        SomeClass mSomeClass;

        @Override
        public void onCreate() {
            super.onCreate();
            mSomeClass.initialize();
        }

        @Override
        protected AndroidInjector<MyApplication> applicationInjector() {
            AppComponent appComponent = DaggerAppComponent.builder().application(this).build();
            appComponent.inject(this);
            return appComponent;
        }
        }

Теперь вы можете вводить в класс Application.

Небольшая заметка: если я сказал что-то не так, пожалуйста, поправьте меня, я не эксперт по Dagger :)

очень шокирован, что это сработало. нет ничего плохого в том, что ты сказал, ты в моих глазах знаток кинжала. тысм

sudocoder 06.09.2019 22:39

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