Свойство lateinit dManager не было инициализировано - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть переменная в моем классе фрагментов:

private lateinit var dManager: DataManager

И я инициализирую ее перед первым использованием здесь:

override fun onResume() {
    super.onResume()
    dManager = MyApp.gManager.getDataManager(sp,level,test)
    if (dManager.hp< 1) { 
       ...
       ...
       ...
    }
}

Этот код работает нормально для меня и большинствапользователи (99,5%), но иногда я получаю отчет о сбое

свойство lateinit dManager не инициализируется

Как это может произойти?Что я должен сделать, чтобы предотвратить это?

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

lateinit var сообщает компилятору, что оно не равно нулю

  1. Если ваше свойство управляется жизненным циклом (например, ссылка на TextView или ImageView, которая раздувается во время жизненного цикла Android Activity)или он инициализируется посредством внедрения, вы не можете предоставить ненулевой инициализатор, и вы должны объявить его тип как обнуляемый.Это, в свою очередь, потребует от вас использования нулевых проверок при каждой ссылке на свойство, что может быть немного неудобно, особенно если вы абсолютно уверены, что свойство будет инициализировано в какой-то момент перед тем, как вы получите к нему доступ в первый раз.
  2. Kotlin имеет простое решение для такого сценария, позволяющее пометить свойство модификатором lateinit.
  3. Если вы получите доступ к свойству до инициализации, вы получите UninitializedPropertyAccessException .

getDataManager (sp, level, test) может иногда возвращать ноль, поэтому для безопасных сторон ваше решение будет выглядеть так: -

override fun onResume() {
super.onResume()
dManager = MyApp.gManager.getDataManager(sp,level,test)
if (::dbManager.isInitialized && dManager.hp< 1) { 
   ...
   ...
   ...
}
}
0 голосов
/ 23 сентября 2019

Может быть вашим getDataManager(sp,level,test) возвращаемым null значением

ИЛИ

В соответствии с документом вы должны проверить объект со свойством .isInitialized.

Returns true if this lateinit property has been assigned a value, and false otherwise.

Проверить, инициализируется ли латинит var

lateinit var file: File    

if (::file.isInitialized) { ... }
...