Dagger-2 «Приложение свойства lateinit не инициализировано» - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь внедрить контекст приложения в класс, который дает

"приложение свойства lateinit не инициализировано"

исключение.

CoreModule.kt

@Module
open class CoreModule {
    @Singleton
    @Provides
    fun provideRealmHelper(): RealmHelper {
        return RealmHelper()
    }
}

MyApplication.kt

open class MyApplication : MultiDexApplication(), HasActivityInjector {

    @Inject
    lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

    val log = LoggerFactory.getLogger(this.javaClass)!!

    companion object {
        var application: MyApplication? = null

        fun getInstance(): MyApplication {
            return application!!
        }
    }

    override fun onCreate() {
        try {
            super.onCreate()
            application = this
            DaggerAppComponent.builder().application(this).build().inject(this)
        } catch (e: Exception) {
            log.error("Exception in Application", e)
            Thread.setDefaultUncaughtExceptionHandler(GlobalExceptionHandler())
        }

    }

    override fun activityInjector() = dispatchingAndroidInjector
}

AppComponent.kt

@Singleton
@Component(modules = [AndroidSupportInjectionModule::class,CoreModule::class])
interface AppComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: MyApplication): Builder

        fun build(): AppComponent
    }

    fun inject(myApplication: MyApplication)

    fun inject(realmHelper: RealmHelper)
}

// Мне нужен контекст приложения в этом классе. Я вставляю applicationContext здесь. Инъекция является правильным способом, или я должен использовать инжектор конструктора?

RealmHelper.kt

class RealmHelper @Inject constructor() {
//need application context here but getting "lateinit property application has not been initialized
    @Inject
    lateinit var application: MyApplication

   init {
        Realm.init(application) // null application
    }
}

Примечание: MyApplication добавлен в AndoridManifest.xml

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Мне нужен контекст приложения в этом классе.Я вписываю заявку в контекст здесь.Является ли инъекция правильным способом, или я должен использовать инжектор конструктора?

Всегда предпочитайте инжектор конструктора, а не инжекцию поля, если это возможно.

Ваш CoreModule не нужен.Приведенного ниже кода достаточно.

@Singleton
class RealmHelper @Inject constructor(private val application: MyApplication) {
//Your implementation 
}

fun inject(realmHelper: RealmHelper) в вашем компоненте также не требуется.

Удаление этих строк должно исправить это, я быстро собрал демонстрационный проект, чтобы проверить его. Здесь - это краткое описание кода.

0 голосов
/ 08 июля 2019

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

@set:Inject
internal var activityDispatchingAndroidInjector: DispatchingAndroidInjector<Activity>? = null

использовать это вместо

@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

, и если вы получаете ту же ошибку в другом месте, сделайте то же самое,Используйте @ set: Inject вместо @ Inject и используйте внутренний вместо lateinit .

Это сработало для менякак очарование.

0 голосов
/ 07 декабря 2018

Проблема в том, что вы аннотировали свое поле, но не вводили.Вы можете ввести поле, как вы делали это в классе приложения: DaggerAppComponent.builder().application(this).build().inject(this)

, или вы можете переместить поле приложения в конструктор RealmHelper, и в основном модуле вам нужно написать функцию обеспечения для возврата приложения.Если вы хотите увидеть пример, у меня есть заявление.https://github.com/volkansahin45/Moneycim

...