У меня есть класс, который должен обрабатывать все уведомления и поэтому расширяет FirebaseMessagingService:
class DefaultFCMHandler(): FirebaseMessagingService(), FCMHandler, KodeinAware {
private val _kodein: Kodein by closestKodein()
override val kodein = Kodein.lazy {
extend(_kodein)
}
private val authenticator: Authenticator by instance()
override fun onNewToken(token: String) {
// ...
}
override fun onMessageReceived(remoteMessage: RemoteMessage) {
// ...
}
}
В классе приложения я связываю все следующим образом:
class MyApplication : Application(), KodeinAware {
override val kodein = Kodein.lazy {
// ...
bind<Authenticator>() with singleton {
DefaultAuthenticator(
instance(),
instance(),
instance()
)
}
// ...
bind<FCMHandler>() with singleton {
DefaultFCMHandler()
}
}
}
Проблема в том, что всеЯ пытаюсь всегда получить следующее исключение:
java.lang.NullPointerException: попытка вызвать виртуальный метод 'android.content.Context android.content.Context.getApplicationContext ()' для ссылки на пустой объект
Я не понимаю, потому что на основе this он должен иметь доступ к контексту (я помещаю файл приложения в манифест).
Iобнаружил this на github, но продвигаемое решение не решает проблему.
Возможно, у меня общее неправильное представление о том, как работает DI.
Полная трассировка стекаследует:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: de.gitlab.user, PID: 14300
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:118)
at org.kodein.di.android.ClosestKt.kodein(closest.kt:25)
at org.kodein.di.android.ClosestKt.access$kodein(closest.kt:1)
at org.kodein.di.android.ContextKodeinPropertyDelegateProvider$provideDelegate$1.invoke(closest.kt:39)
at org.kodein.di.android.ContextKodeinPropertyDelegateProvider$provideDelegate$1.invoke(closest.kt:38)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
at de.gitlab.user.data.fcm.DefaultFCMHandler.get_kodein(Unknown Source:7)
at de.gitlab.user.data.fcm.DefaultFCMHandler.access$get_kodein$p(DefaultFCMHandler.kt:16)
at de.gitlab.user.data.fcm.DefaultFCMHandler$kodein$1.invoke(DefaultFCMHandler.kt:21)
at de.gitlab.user.data.fcm.DefaultFCMHandler$kodein$1.invoke(DefaultFCMHandler.kt:16)
at org.kodein.di.internal.KodeinImpl$Companion.newBuilder(KodeinImpl.kt:22)
at org.kodein.di.internal.KodeinImpl$Companion.access$newBuilder(KodeinImpl.kt:21)
at org.kodein.di.internal.KodeinImpl.<init>(KodeinImpl.kt:19)
at org.kodein.di.Kodein$Companion$lazy$1.invoke(Kodein.kt:447)
at org.kodein.di.Kodein$Companion$lazy$1.invoke(Kodein.kt:429)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
at org.kodein.di.LazyKodein.getBaseKodein(Unknown Source:7)
at org.kodein.di.LazyKodein.getContainer(lateinit.kt:31)
at org.kodein.di.KodeinAwareKt$Instance$1.invoke(KodeinAware.kt:176)
at org.kodein.di.KodeinAwareKt$Instance$1.invoke(Unknown Source:4)
at org.kodein.di.KodeinProperty$provideDelegate$1.invoke(properties.kt:42)
at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
at de.gitlab.user.data.fcm.DefaultFCMHandler.getAuthenticator(Unknown Source:7)
at de.gitlab.user.data.fcm.DefaultFCMHandler.sendRegistrationToServer(DefaultFCMHandler.kt:74)
at de.gitlab.user.data.fcm.DefaultFCMHandler.access$sendRegistrationToServer(DefaultFCMHandler.kt:16)
at de.gitlab.user.data.fcm.DefaultFCMHandler$submitToken$1.onComplete(DefaultFCMHandler.kt:50)
at com.google.android.gms.tasks.zzj.run(Unknown Source:4)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)