web-dev-qa-db-fra.com

Le modificateur Lateinit n'est pas autorisé sur les propriétés de type primitif dans Kotlin

Je définis comme une variable d'instance dans kotlin et je veux l'initialiser onCreate méthode d'un activity.

var count: Int
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    count.inc()
}

Ici, je reçois une erreur ci-dessous sur la variable de comptage.

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

Eh bien, j'ai lu ce fil la propriété doit être initialisée ou abstraite et j'ai essayé la même chose mais encore une fois, j'obtiens une erreur ci-dessous.

le modificateur Lateinit n'est pas autorisé sur les propriétés de type primitif

lateinit var count: Int
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    count.inc()
}

Existe-t-il un moyen de le faire dans Kotlin?

30
N Sharma

Il existe plusieurs façons de résoudre ce problème.

Vous pouvez l'initialiser avec la valeur par défaut (e.i 0 ou -1 ou autre), puis l'initialiser chaque fois que votre logique le dit.

Ou dites au compilateur que le nombre sera initialisé plus tard dans ce code en utilisant Delegates.notNull check notNull .

var count: Int by Delegates.notNull<Int>()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // You can not call `Int.inc()` in onCreate()` function until `count` is initialised.
    // count.inc()
    // **initialise count** 
}

Et si vous avez besoin d'une valeur de comptage à la demande (si ce n'est pas nécessaire d'initialiser dans onCreate), vous pouvez utiliser la fonction lazy. Utilisez ceci uniquement si vous avez une tâche intensive (certains calculs/gonfler une mise en page, etc.) que vous souhaitez effectuer on demand, Ne pas simplement assigner une valeur.

var count:Int by lazy {
    // initialise
}

Vous pouvez maintenant décider quoi utiliser.

J'espère que ça aide.

46
chandil03