Неинициализированное исключение при инициализации свойства "поздний инициал" - PullRequest
0 голосов
/ 05 марта 2019

Я не совсем уверен, что мой случай просто невозможен со свойствами поздней инициализации.Но позвольте мне спросить:)

У меня есть applicationController, который используется почти во всех видах деятельности - поэтому я создал BaseActivity

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

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 05 марта 2019

Поскольку вы переопределяете неправильный метод в BaseActivity, поэтому ваше приложение вылетает.

Решение: Измените код на

abstract class BaseActivity : AppCompatActivity() {

    lateinit var applicationController: ApplicationController

    // [IMPORTANT] Remove or comment-out this method
//    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
//        super.onCreate(savedInstanceState, persistentState)
//        applicationController = ApplicationController.getInstance(applicationContext)
//    }

    // Override this method
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        applicationController = ApplicationController.getInstance(applicationContext)
    }
}

Объяснение: В этом разделе объясняется, почему код не работает.

kotlin.UninitializedPropertyAccessException

Это подкласс приложения RuntimeException, приложениявыдает это исключение, когда вы обращаетесь к объекту, вызывая свойства или методы самостоятельно перед инициализацией.

Когда создается действие LoginScreen, Android вызывает его метод onCreate.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setContentView(R.layout.activity_login_screen)

    emailMatcher = applicationController.getEmailMatcher()
    passwordMatcher = applicationController.getPasswordMatcher()
}

В первой строке super.onCreate(savedInstanceState) будет вызываться onCreate метод его родителя, в этом случае будет вызываться onCreate (bundle) в BaseActivity деятельности.

К сожалению, в операции BaseActivity вы переопределяете и помещаете исходный код для applicationController в другой метод onCreate(bundle, persistentState), который очень похож на onCreate (bundle).Разница между ними заключается в количестве параметров.В результате на данный момент applicationController все еще не инициализирован.

override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
    super.onCreate(savedInstanceState, persistentState)
    applicationController = ApplicationController.getInstance(applicationContext)
}

Пока приложение не достигнет этой строки

emailMatcher = applicationController.getEmailMatcher()

Поскольку вы вызываете метод getEmailMatcher для неинициализированного объектаapplicationController, поэтому приложение выдает kotlin.UninitializedPropertyAccessException и приводит к сбою приложения.

...