Kotlin: Dagger2 @Inject context var всегда null

Я пытаюсь сделать модуль в AndroidStudio, который не связан с Android, у него нет действий, но мне нужен контекст для нескольких вещей, таких как Room database.

Вот моя настройка:

AppComponent

@Singleton @Component(modules = arrayOf(AndroidSupportInjectionModule::class, AppModule::class)) interface AppComponent : AndroidInjector<NexoApplication> { @Component.Builder interface Builder { @BindsInstance fun application(application: NexoApplication): Builder fun build(): AppComponent } override fun inject(app: NexoApplication) } 

AppModule

 @Module class AppModule { @Singleton @Provides fun provideLogger(application: NexoApplication) = LogNexoManager(application) } 

AppLifecycleCallbacks

 interface AppLifecycleCallbacks { fun onCreate(application: Application) fun onTerminate(application: Application) } 

Приложение

 class NexoApplication: DaggerApplication() { @Inject lateinit var appLifecycleCallbacks: AppLifecycleCallbacks override fun applicationInjector() = DaggerAppComponent.builder() .application(this) .build() override fun onCreate() { super.onCreate() appLifecycleCallbacks.onCreate(this) } override fun onTerminate() { appLifecycleCallbacks.onTerminate(this) super.onTerminate() } } 

AndroidManifest.xml

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.elstatgroup.elstat"> <application android:name="com.elstatgroup.elstat.NexoApplication" android:allowBackup="true" android:label="@string/app_name" android:supportsRtl="true"> </application> 

И я пытаюсь использовать контекст для своего основного класса следующим образом:

 class LogNexoManager(app: Application){ var logRepository: LogRepository init { logRepository = LogRepositoryImpl(app) } } 

Тест единицы измерения всегда неверен

  @Test fun proceedWithLogs(){ val logManager = LogManager() } 

Исключение составляет:

kotlin.UninitializedPropertyAccessException: свойство свойства lateinit не было инициализировано

UPDATE: Я внес изменения, предложенные @Emanuel S, и теперь у меня есть ошибка, например:

Ошибка: выполнение выполнено для задачи ': nexo: kaptDebugKotlin'. Внутренняя ошибка компилятора. Подробнее см. Журнал

Мой файл Build.gradle:

 apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' android { compileSdkVersion 26 defaultConfig { minSdkVersion 15 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } 

}

 ext.daggerVersion = '2.11' ext.roomVersion = '1.0.0-alpha9' dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.1', { exclude group: 'com.android.support', module: 'support-annotations' }) compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" // RxJava implementation 'io.reactivex.rxjava2:rxjava:2.1.0' implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' // Room implementation "android.arch.persistence.room:runtime:$roomVersion" implementation "android.arch.persistence.room:rxjava2:$roomVersion" kapt "android.arch.persistence.room:compiler:$roomVersion" compile "org.jetbrains.kotlin:kotlin-stdlib:1.1.51" androidTestImplementation "android.arch.persistence.room:testing:$roomVersion" compile "com.google.dagger:dagger:$daggerVersion" compile "com.google.dagger:dagger-android:$daggerVersion" compile "com.google.dagger:dagger-android-support:$daggerVersion" kapt "com.google.dagger:dagger-android-processor:$daggerVersion" kapt "com.google.dagger:dagger-compiler:$daggerVersion" implementation "com.google.dagger:dagger-android-support:2.11-rc2" // version may be not up 2 date later. } repositories { mavenCentral() } 

Solutions Collecting From Web of "Kotlin: Dagger2 @Inject context var всегда null"

Вот простой пример. Не проверен, но должен показать концепцию, как вы должны вводить в свой LogManager.

 @Singleton @Component(modules = arrayOf(AndroidSupportInjectionModule::class, AppModule::class)) interface AppComponent : AndroidInjector<App> { { @Component.Builder interface Builder { @BindsInstance fun application(application: App): Builder fun build(): AppComponent } override fun inject(app: App) } @Module class AppModule { @Singleton @Provides fun provideYourDb(application: App) = Room.databaseBuilder(application, YourDb::class.java, "your.db").build() @Singleton @Provides fun provideLogger(application: App) = LogManager(application) } 

Интерфейс для жизненного цикла приложений.

 interface AppLifecycleCallbacks { fun onCreate(application: Application) fun onTerminate(application: Application) } 

Ваше приложение должно расширить DaggerApplication ().

 class App:DaggerApplication() { @Inject lateinit var appLifecycleCallbacks: AppLifecycleCallbacks override fun applicationInjector() = DaggerAppComponent.builder() .application(this) .build() override fun onCreate() { super.onCreate() appLifecycleCallbacks.onCreate(this) } override fun onTerminate() { appLifecycleCallbacks.onTerminate(this) super.onTerminate() } } 

наконец, у вас есть предоставленный LogManager.

 class LogManager (val app: App) 

Если вы действительно хотите использовать @Inject внутри своего LogManager, вы можете ввести его внутри своего AppComponent, используя fun inject(logManager: LogManager) .

Интерфейс жизненного цикла используется для автоматического ввода действий / служб в случае, если вы хотите продлить его позже. Пример:

Класс входа в приложение

 override fun onCreate() { super.onCreate() applyAutoInjector() appLifecycleCallbacks.onCreate(this) } fun Application.applyAutoInjector() = registerActivityLifecycleCallbacks( object : Application.ActivityLifecycleCallbacks { override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { handleActivity(activity) } //truncated ... }) 

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

 implementation "com.google.dagger:dagger-android-support:2.11-rc2" // version may be not up 2 date later.