Error de la aplicación porque la instancia de la aplicación lateinit no se ha inicializado

Intento save una instancia de aplicación y utilizarla en el constructor de databaseHelper, pero cuando mi actividad intenta crear una instancia de databaseHelper, recibo las siguientes excepciones:

FATAL EXCEPTION: main Process: com.weatherupp.weatherupp, PID: 29092 java.lang.ExceptionInInitializerError at com.weatherupp.weatherupp.ui.MainActivity.onCreate(MainActivity.kt:27) [...] Caused by: kotlin.UninitializedPropertyAccessException: lateinit property instance has not been initialized 

el código que conduce a la exception es el siguiente:

 MainActivity { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val provider = ForecastProvider() [...] } 

ForecastProvider tiene el siguiente object complementario:

 companion object { val SOURCES = listOf(ForecastServer(), ForecastDb()) } 

El constructor de ForecastDb se refiere a una instancia de ForecastDbHelper, cuyo constructor hace reference a App.instance, declarado de la siguiente manera:

 class App : Application() { companion object { lateinit var instance: App } override fun onCreate() { super.onCreate() instance = this } } 

Si comento todo el código que hace reference a la database, la aplicación funciona usando ForecastServer como fuente de datos, pero en el momento en que trato de referirme a la database y, por lo tanto, a la aplicación, Kotlin lanza UninitializedPropertyAccessException.

He estado mirando el código durante horas, no puedo entender lo que estoy haciendo mal. Cualquier ayuda es bendecida, gracias a todos ustedes de antemano.

No puedo precisar exactamente por qué su enfoque no funciona pero puedo sugerir una solución:

Necesita una ForecastDb en su MainActivity . Su ForecastDb necesita un ForecastDbHelper . Su ForecastDbHelper necesita la instancia de la Application .

Entonces en tu MainActivity haces:

 val helper = ForecastDbHelper(application as App) val db = ForecastDb(helper) 

y listo, tienes listo tu DB.

Esto se llama dependency injection y le da más control sobre la creación de los objects que 'captan' sus propias dependencies.

EDITAR : También verifica si agregaste tu class de App como la Application en el AndroidManifest.xml como este ::

 <application android:name=".base.App" ... 

No soy un experto en Kotlin, pero parece que los objects complementarios se inicializaron antes que invocan al constructor de la class padre. Probablemente, cuando su val SOURCES intente iniciar arroja una exception cuando intenta utilizar la instancia de la aplicación onCreate() antes de la aplicación onCreate() ). Aquí puede leer que un object complementario se inicializa cuando se carga (resuelve) la class correspondiente, haciendo coincidir la semántica de un inicializador estático de Java

  • Burlarse del campo final con Kotlin
  • La autorización de código de Spotify se rechaza por malas cnetworkingenciales, a pesar de que se envía un token válido
  • Faltan classs en android studio 3.0 canary 4 ui preview
  • Extensiones Kotlin references no resueltas
  • modificar una class Kotlin
  • La propiedad de Android Kotlin Protected expone su tipo privado ExpiresLayout
  • ¿Cómo se resuelve la violación de la restricción de límites finitos en Kotlin?
  • Métodos de interfaz de anulación de Android kotlin dentro del método onCreateView ()
  • Problema de actualización de Android Gradle plugin 3.0.0
  • Serialización KMongo de BSONTimestamp
  • Tipo no coincidente: ¿tipo inferido es FragmentActivity? pero se esperaba Context al actualizar la biblioteca de soporte a 27.0.0