web-dev-qa-db-fra.com

Kotlin - La propriété doit être initialisée ou abstraite même s'il existe une fonction init ()

J'ai converti ce code de Java en Kotlin avec Android Studio 3.0

internal var background: Drawable
internal var xMark: Drawable

private fun init() {
    background = ColorDrawable(Color.RED)
    xMark = ContextCompat.getDrawable(this@Subscriptions_main, R.drawable.delete)
}

Sur les lignes 1 et 2, je reçois l'erreur: 

La propriété doit être initialisée ou abstraite

même si cela va être initialisé dans la fonction init.

Est en train d'écrire:

internal var background: Drawable? = null
internal var xMark: Drawable? = null

une solution viable et efficace? Y a-t-il une autre meilleure façon?

3
Daniele

Avant d’utiliser lateinit, vous devez comprendre ce que cela signifie. 

Vos variables ne sont pas initialisées correctement. Divers moyens de résoudre ce problème:

  • Initialiser les variables à l'intérieur du constructeur ou un bloc init approprié (pas une fonction privée telle que vous l'avez déclarée)
  • Initialisez les variables en même temps que vous les déclarez
  • Initialisez les variables plus tard et faites savoir à Kotlin que (c'est le mot clé lateinit)

Ces 3 options ne sont pas équivalentes et, selon votre code, les deux premières peuvent être plus appropriées que la troisième.

lateinit fera planter votre application si vous accédez aux variables avant qu'elles ne soient réellement initialisées.

8

Les blocs init ne sont pas des fonctions, il suffit de supprimer la partie private fun et les parenthèses:

internal var background: Drawable
internal var xMark: Drawable

init {
    background = ColorDrawable(Color.RED)
    xMark = ContextCompat.getDrawable(this@Subscriptions_main, R.drawable.delete)
}
2
hotkey

Vous avez besoin du mot clé lateinit. Vérifiez la documentation .

0
Héctor